我有以下(当然是简化的)描述符:
class d:
def __init__(self, method):
self.method = method
def __get__(self, instance, owner=None):
print(instance, owner, self.method)
return self.method(instance)
在__get__()
中,我想访问定义修饰函数的类,但在以下代码中发生的两次__get__()
调用中,owner
参数都是B
:
class A:
@d
def f(self):
return "A"
class B(A):
@d
def f(self):
return super().f + "B"
print(B().f)
我查看了Descriptor HowTo Guide关于通过super()
调用描述符的部分,它说这个调用确实将子类类型传递给父类__get__()
。这是否表明我可能需要定义__getattribute__()
来获得我想要的,还是有别的方法?我知道super()
调用不t只是返回A
,而是B
的代理,但我觉得应该有一种方法在描述符中获得A
。
我也希望能更清楚地解释我的代码中发生了什么。
1条答案
按热度按时间oxalkeyp1#
更简单的做法是在描述符中记录在创建类时定义的类。
从Python 3.6开始,由于在描述符协议中添加了
__set_name__
方法,这是可能的。在
__set_name__
中接收的owner
参数是定义描述符的actuall类。然后可以将其设置为描述符属性:并将此代码与示例
A
和B
一起运行:如果不求助于
__set_name__
,那么要做的事情实际上就是线性遍历__mro__
,直到找到self
,只要它没有被另一个同类的装饰器遮蔽: