符合Python风格的对象

私有属性的设置

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

原文地址:https://www.cnblogs.com/5poi/p/11251064.html