首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python对象属性的那些事

1._dict__属性

在没使用 的情况下, 会为每个实例创建一个 字典,来保存实例的所有属性。在进行属性寻找的时候,会先在对象的 中找,找不到,就去类的 中找,再找不到就去父类的 中找,。。

2.__slots__属性

类是创建对象的模版。在静态类型语言中,对象只能拥有类中定义的那些属性。而在Python中,可以在运行时,随意的增加或删除对象的属性。这就很可能造成:运行时,为对象增加了很多属性,占用了很多的内存。为了避免类似的现象, Python的新式类提供了 类属性,用来限制类的对象所能拥有的属性 。

默认情况下, 会为每一个实例创建一个属性字典 ,用来保存实例的所有属性。但是当使用 时, 不会为实例创建该字典。

当父类没有 时,子类仍然有 , 之外的属性,会被保存到属性字典中。此时, 的意义,也就不大了。

当父类也有 时,子类的 的值,可以看成是自己的 加上 父类的 。

3.描述符

(1.有三个方法:

重写了其中一个或多个方法的对象,就是描述符。

(2.注意:

描述符必须是新式类的对象

描述符是在 方法中,被调用的。重写 方法,可能会阻止描述符的自动调用

描述符必须是类属性(因此,描述符是被类的所有实例所共享的)。当使用该类的实例访问描述符时,会自动调用 方法;设置描述符时,会自动调用 方法;删除描述符时,会自动调用 方法

Python中的很多高级特性,都是通过描述符实现的。比如,staticmethod、classmethod等。

(3.下面看一个自己实现classmethod的例子:

4.与属性相关的魔术方法

(1.属性访问

它是新式类的一个魔术方法,访问对象的任意属性时,都会先调用这个方法。如果这个方法,抛出AttributeError,则调用对象的 方法

当对象没有名为 的属性时,就会调用它的 方法

(2.当使用内建函数getattr(obj, attr_name, ...)获取obj的属性时:

如果是新式类,则先调用 方法,如果出AttributeError,则调用 方法

如果是经典类,在找不到该属性的情况下,会调用 方法

(3.需要注意的是:

在 和 方法中,调用 可能会造成死递归。一个解决方案是使用 (新式类)。

(4.设置属性

当设置对象的属性时,会调用这个魔术方法。

当使用内建函数setattr(obj, name, value)设置对象的属性时,会调用 方法。所以在 方法中,调用 可能造成死递归。一个解决方案是使用属性字典 。比如:

(5.删除属性

方法 和 delattr内建函数:

作者:蒂米的博客

转载请注明出处

http://timd.cn/python-attribute/?utm_source=tuicool&utm_medium=referral

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180116A0R3OP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券