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