python数据模型,就是对python语言框架的描述,规范了这门语言自身构建模块的接口。
每次都要提醒自己,python是面向对象的,要用面向对象的方法来思考问题。
私有和被保护的属性
- 类的私有属性:两个下划线开头(简称dunder),声明该属性为私有,不能在对象(类)外部或直接使用,例如:__private_attrs;
- 类的方法:在类的内部,使用关键字def定义类的方法,与一般函数定义不同,类的方法必须包含参数self,且为第一个参数;
- 类的私有方法:以两个下划线开头,与类的私有属性类似,例如:__private_methods()。
- 魔术方法:以双下划线开头并以双下划线结束的特殊方法,例如__getitem__(),这些特殊方法能让你自己的对象实现和支持以下的语言架构,并与之交互(在《流畅的python》书中,作者将这种方法称作“魔术方法(megic method)”或 “dunder method”):
- 迭代
- 集合类
- 属性访问
- 运算符重载
- 函数的方法的调用
- 对象的创建和销毁
- 字符串表示形式和格式化
- 管理上下文
默认情况下,类的属性和方法都是公开的,python中没有类似public或private等关键字来修饰类的方法和属性。
在内部,python使用一种“name mangling”技术,将__membername替换成_class__membername,因此,用户在外部访问__membername就会被提示找不到相应的变量。
python的私有变量和方法仍然是可以访问的,方法如下:
- 实例._类名__变量名
- 实例._类名__变量名
也就是说,python没有“真正”的私有机制,而是通过下划线实现“伪私有”,所以python中腰避免定义下划线开头的变量和方法。
变量名格式 | 含义 |
---|---|
_xxx | 单下划线开头的变量叫做“保护变量”,只有类的实例和子类实例能访问 |
__xxx | 双下划线开头的变量,即私有成员,只有类对象自己能访问,子类对象也不能访问 |
xxx | 系统定义成员,python的专用标识,例如__init__() |