符合Python风格的对象

 

私有属性的设置

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 修改

相关文章
相关标签/搜索