通过 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__
中的代码更改为以下备选方案:
type(self).arg1
object.__getattribute__(self, attr)
它将照常工作。
此外,以下也有效:
getattr(C, 'arg1')
但当我将它设置为 object.__getattribute__(type(self), attr)
时却没有。我想知道为什么它不起作用。
object.__getattribute__
是查找类型属性的错误 __getattribute__
方法。 type.__getattribute__
是正确的方法。
如果您对一个类型调用object.__getattribute__
,它将执行普通对象的属性查找过程。它不会搜索参数的 MRO,也不会调用描述符,除非它们在元类中找到。
(也就是说,即使您切换到调用 type.__getattribute__
,您的 __getattribute__
实现也没有意义。它会打印您期望它打印的内容,但它不会'没有道理。)
简而言之,我有以下信息:
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__
中的代码更改为以下备选方案:
type(self).arg1
object.__getattribute__(self, attr)
它将照常工作。
此外,以下也有效:
getattr(C, 'arg1')
但当我将它设置为 object.__getattribute__(type(self), attr)
时却没有。我想知道为什么它不起作用。
object.__getattribute__
是查找类型属性的错误 __getattribute__
方法。 type.__getattribute__
是正确的方法。
如果您对一个类型调用object.__getattribute__
,它将执行普通对象的属性查找过程。它不会搜索参数的 MRO,也不会调用描述符,除非它们在元类中找到。
(也就是说,即使您切换到调用 type.__getattribute__
,您的 __getattribute__
实现也没有意义。它会打印您期望它打印的内容,但它不会'没有道理。)