gpt4 book ai didi

Python:有时,元类属性会覆盖类属性吗?

转载 作者:太空狗 更新时间:2023-10-30 01:38:14 24 4
gpt4 key购买 nike

下面代码的结果让我感到困惑:

class MyClass(type):
@property
def a(self):
return 1

class MyObject(object):
__metaclass__ = MyClass

a = 2

print MyObject.a
print object.__getattribute__(MyObject, 'a')
print type.__getattribute__(MyObject, 'a')
print MyObject.__dict__['a']
print MyObject().a

我真的希望它只是重复打印 2,但它打印的是 1 1 1 2 2。有没有一种方法可以直观地理解这一点?


澄清一下:我知道这种行为有很好的记录(here, "data descriptors"),但我想了解为什么这是有道理的,以及为什么核心开发人员以这种方式实现描述符。

最佳答案

属性是 data descriptors ;在属性查找中,它们优先于具有该属性的类实例的字典中的同名条目。这意味着用

MyObject.a

MyClass 中的 a 属性优先于 MyObject 字典中的 a 条目。同样,

object.__getattribute__(MyObject, 'a')
type.__getattribute__(MyObject, 'a')

object.__getattribute__type.__getattribute__ 都尊重数据描述符优先于实例字典条目的优先级,因此属性胜出。

另一方面,

MyObject.__dict__['a']

这明确地进行了字典查找。它只看到 MyObject 的字典中的内容,忽略了正常的属性查找机制。

最后一行:

MyObject().a

MyClass 描述符仅适用于 MyClass 的实例,而不是其实例的实例。属性查找机制看不到属性。

关于Python:有时,元类属性会覆盖类属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22586327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com