符合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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值