微信二维码
微博二维码
qq号二维码

Python 中几种属性访问的区别

王伟平 2022.06.29 721人浏览
Python 中几种属性访问的区别
起步
的提供一系列和属性访问有关的特殊方法:。
本文阐述它们的区别和用法。
属性的访问机制
一般情况下,属性访问的默认行为是从对象的字典中获取,
并当获取不到时会沿着一定的查找链进行查找。
例如 的查找链就是,从 ,
然后是 ,再通过 的基类开始查找。
若查找链都获取不到属性,则抛出 异常。
一、方法
这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,
不会调用 方法。
A:
    a = (item):
        ()
        item

t = A()
(t.a)
(t.b)
__getattr__ call
b
二、方法
这个方法会被无条件调用。不管属性存不存在。如果类中还定义了 ,
则不会调用 方法,除非在 方法中显示调用或者抛出了 。
A:
    a = (item):
        ()
        (item):
        ()
        item

t = A()
(t.a)
(t.b)
所以一般情况下,为了保留 getattr 的作用,__getattribute__() 方法中一般返回父类的同名方法:
(selfitem):
    .(selfitem)
使用基类的方法来获取属性能避免在方法中出现无限递归的情况。
三、方法
这个方法比较简单说明,它与前面的关系不大。

如果一个类中定义了 或 中的任何方法。
 则这个类的对象称为描述符。
class Descri(object):
    def __get__(self, obj, type=None):
        print("call get")

    def __set__(self, obj, value):
        print("call set")

class A(object):
    x = Descri()

a = A()
a.__dict__['x'] = 1  # __get__
a.x                  # __get__
如果查找的属性是在描述符对象中,
则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,
而这个行文也会因为调用的不同而稍有不一样:

如果调用是对象实例题目中的调用方式,
则转换为调用:。
如果调用的是类属性则转换为:其他情况见文末参考资料的文档
四、__getitem__ 方法
这个调用也属于无条件调用,这点与 一致。
区别在于 让类实例允许 运算,可以这样理解:


适用于所有运算符;


适用于所有 运算符。
(item):
    ()
    item
t = A() print(t['a']) print(t['b'])
如果仅仅想要对象能够通过 [] 获取对象属性可以简单的:
(selfitem):
    .(selfitem)
总结
当这几个方法同时出现可能就会扰乱你了。
我在网上看到一份示例还不错,稍微改了下:
C():
    a = (*args**kwargs):
        ()
        .(*args**kwargs)

    (name):
        ()
        name + (instanceowner):
        (instanceowner)
        (item):
        ()
        .(item)

    (x):
        (x)

C2():
    d = C()

__name__ == :
    c = C()
    c2 = C2()
    (c.a)
    (c.zzzzzzzz)
    c2.d
    (c2.d.a)
    (c[])

文章转自:掘金社区

分享到:
天津UI设计培训-CleanPNG免抠素材网站
  • 2020.11.30
  • 2024什么价格?天津平面设计/UI设计师就业实录
  • 2024.03.20