Python中不存在真正意义上的私有方法,为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,或者“__"双下划线
"_xx"单下划线
意味着该方法或属性外部不应该去调用,它并不属于API。但这只是一种约定,其实这样的实例变量外部是可以访问的。即它是表面私有。
- 可被外部访问(但不建议)
- 可被子类继承(但不建议)
"__xx"双下划线
- 不可被外部访问
- 不可被继承
只有在类内部进行访问,所以外部访问时可在类中自定义方法实现, 由于它不可被子类继承,可以避免被子类覆盖。
"__xx"的形式
| class Student: |
| __name = "zhangsan" |
| class Student: |
| def __init__(self): |
| self.__name = "zhangsan" |
外部访问"__xx"的几种方式
| class Student: |
| __name = "zhangsan" |
| |
| s = Student() |
| s._Student__name |
| # 'zhangsan' |
在类的内部自定义get_age()和set_age()两个函数供外界调用私有化属性
| class Student: |
| def __init__(self): |
| self.__age = 18 |
| pass |
| def get_age(self): |
| return self.__age |
| def set_age(self,age): |
| if age<0: |
| print('age can not under 0') |
| pass |
| else: |
| self.__age = age |
| pass |
| pass |
| |
| s = Student() |
| s.get_age() |
| |
property
| class Student: |
| def __init__(self): |
| self.__name = "zhangsan" |
| |
| def get_name(self): |
| return self.__name |
| |
| def set_name(self, value): |
| self.__name = value |
| |
| def del_name(self): |
| del self.__name |
| |
| name = property(get_name, set_name, del_name, "I'm the 'x' property.") |
| |
| s= Student() |
| s.name |
| Out[4]: 'zhangsan' |
| |
| s.name = "lisi" |
| s.name |
| Out[6]: 'lisi' |
| |
| del s.name |
| s.name |
| Traceback (most recent call last): |
| File "C:\Users\ISSUSER\AppData\Local\Programs\Python\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3444, in run_code |
| exec(code_obj, self.user_global_ns, self.user_ns) |
| File "<ipython-input-8-98b019fbfe94>", line 1, in <module> |
| s.name |
| File "<ipython-input-2-7f819d4fa85e>", line 6, in get_name |
| return self.__name |
| |
property装饰器
| class Student: |
| def __init__(self): |
| self.__name = "zhangsan" |
| @property |
| def name(self): |
| """I'm the 'name' property.""" |
| return self.__name |
| |
| |
| |
| @name.setter |
| def name(self, value): |
| self.__name = value |
| @name.deleter |
| def name(self): |
| del self.__name |
| |
| s = Student() |
| s.name |
| Out[11]: 'zhangsan' |
| s.name = "wangwu" |
| s.name |
| Out[13]: 'wangwu' |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!