当我通过类名访问类的属性时,Python 调用了什么方法?

fit*_*itz 6 python python-3.x

我知道通过实例访问 Foo 的属性会调用该__getattribute__()方法,但是如果我直接通过类访问这个属性呢?如果调用了一个函数,我想在其中设置一个断点,以便在我的项目中通过类访问此属性时可以触发断点。

我试图在魔法方法中设置断点__getattribute__(),但没有发生任何事情。

class Foo:
    age = 18


print(Foo.age)  # I am curious what method is called
Run Code Online (Sandbox Code Playgroud)

a_g*_*est 5

Python 中的一切都是一个对象,一切都有一个type决定对象行为的 。这也适用于类对象。您可以检查type(Foo)

>>> type(Foo)
<class 'type'>
Run Code Online (Sandbox Code Playgroud)

您可以通过提供自定义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)
Run Code Online (Sandbox Code Playgroud)

输出是:

__getattribute__(<class '__main__.Foo'>, 'age')
18
Run Code Online (Sandbox Code Playgroud)