Python的私有属性和受保护的属性:python
若是有人编写了Dog类,这个类内部用到了mood实例属性,可是没有将其开放。spa
如今,你建立了Dog类的子类:Beagle。对象
若是你在绝不知情的状况下又建立了名为mood的实例属性,那么在继承的方法中就会把Dog类的mood属性覆盖掉。blog
名称改写:继承
为了不这个状况,若是以__mood的形式命名实例属性,Python会把属性存入实例的__dict__属性中,并且会在前面加上一个下划线和类名。内存
所以,对Dog类来讲,__mood会变成_Dog__mood;对Beagle来讲,会变成_Beagle__mood。这个特性就是名称改写。字符串
约定俗成:class
对于不喜欢使用名称改写的人,他们约定使用一个下划线前缀编写的“受保护”的属性。(如:_MyThing_blahblah)引用
相似于使用全大写字母表示一个常量。方法
__slots__类属性节省空间:
默认状况下,Python在各个实例中名为__dict__的字典里存储实例属性,字典会消耗大量内存。
继承自父类的__slots__属性没有效果。
Python只会使用各个类当前类中定义的__slots__属性。
建立一个类属性__slots__,把它的值设为一个字符串构成的可迭代对象,其中各个元素表示各个实例属性。
class Vector: __slots__ = ('__x','__y')
在类中定义了__slots__属性以后,实例不能再有__slots__中所列名称以外的其余属性。
若是类中定义了__slots__属性,并且想把实例做为弱引用的目标,要把 '__weakref__' 添加到__slots__中。
实例只能拥有__slots__属性,除非把 "__dict__" 加入到__slots__中后,会支持动态建立属性。
覆盖类属性:
类属性可用于为实例属性提供默认值。
若是为不存在的实例属性赋值,会新建实例属性。
若是想修改类属性的值,必须直接在类上修改,不能经过实例修改。
若是想修改全部实例的XX属性的默认值,能够经过 类.XX 修改