通过 object.__getattribute__(type(self), attr) 调用描述符将不起作用

Invoke descriptor through object.__getattribute__(type(self), attr) won't work

简而言之,我有以下信息:

class Descriptor:
    def __set_name__(self, owner, name):
        self.public_name = name
        self.private_name = '_' + name

    def __get__(self, instance, owner):
        print('something')

    def __set__(self, instance, value):
        setattr(instance, self.private_name, value)

class C:
    arg1 = Descriptor()

    def __init__(self, name):
        self.arg1 = name

    def __getattribute__(self, attr):
        if attr == 'arg1':
            object.__getattribute__(type(self), attr)

c = C('Henry')
c.arg1

为什么 c.arg1 什么都不做,而不是打印出 __get__ 中定义的 something

显然,如果我将 __getattribute__ 中的代码更改为以下备选方案:

它将照常工作。

此外,以下也有效:

但当我将它设置为 object.__getattribute__(type(self), attr) 时却没有。我想知道为什么它不起作用。

object.__getattribute__ 是查找类型属性的错误 __getattribute__ 方法。 type.__getattribute__ 是正确的方法。

如果您对一个类型调用object.__getattribute__,它将执行普通对象的属性查找过程。它不会搜索参数的 MRO,也不会调用描述符,除非它们在元类中找到。

(也就是说,即使您切换到调用 type.__getattribute__,您的 __getattribute__ 实现也没有意义。它会打印您期望它打印的内容,但它不会'没有道理。)