我知道通过实例访问 Foo 的属性会调用 __getattribute__()
方法,但是如果我直接通过类访问这个属性呢?如果调用了一个函数,我想在其中设置一个断点,以便在我的项目中通过类访问此属性时可以触发断点。
我试图在魔术方法中设置断点 __getattribute__()
,但什么也没发生。
class Foo:
age = 18
print(Foo.age) # I am curious what method is called
最佳答案
Python 中的一切都是一个对象,一切都有一个 type
这决定了对象的行为。这也适用于类对象。您可以查看 type(Foo)
:
>>> type(Foo)
<class 'type'>
您可以通过提供自定义 metaclass
来自定义类的类型.这个元类然后负责对类对象的属性访问:class MyMeta(type):
def __getattribute__(self, name):
print(f'__getattribute__({self!r}, {name!r})')
return super().__getattribute__(name)
class Foo(metaclass=MyMeta):
age = 18
print(Foo.age)
输出是:__getattribute__(<class '__main__.Foo'>, 'age')
18
关于python - 当我通过类名访问类的属性时,Python 调用了什么方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62947484/