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

标签 python python-3.x

我知道通过实例访问 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/

相关文章:

python - 从嵌套的 span 标签获取数据

python - 在新的virtualenv中安装wheel软件包时,导入旧django项目模型的任何方法

python - BeautifulSoup4 藏在哪里?

非字符串的 Python 实习生

python - 如何防止 pd.concat 在同名列后插入 `.1` ?

MacOS 上的 Python3、gcc 和 clang

python-3.x - Google Cloud Function/Python 3.7/requirements.txt 使部署失败

python - 在Django中的html模式中加载动态数据

python - python 中的协程在 3.4 和 3.5 之间,如何保持向后兼容性?

python - 用Python 3编写iOS游戏的最佳库是什么?