我想了解方法作为描述符是如何工作的。
有这样的写法。这个:
为了支持方法调用,函数包括 __get__()
方法,用于在属性访问期间绑定方法。这意味着所有的函数都是非数据描述符,当它们从一个对象中被调用时,会返回绑定方法。
基于这种描述以及 "Dotted access from a class calls __get__()"
我以为可以装饰 __get__
的类方法。
我想把 someFunction.__get__
:
def wrap(func):
def wrapped(*args, **kwargs):
print("Wrapping...")
return func(*args, **kwargs)
return wrapped
class SomeClass():
def someFunction(self):
print("someFunction called")
someFunction.__get__ = wrap(someFunction.__get__)
obj = SomeClass()
obj.someFunction()
产出只是 "someFunction called"
仿佛什么都没有改变。
所以我的问题是:为什么 Wrapping...
日志没有打印出来吗?"分配"。
someFunction.__get__ = wrap(someFunction.__get__)
有什么问题吗?
从 描述符 文档中的方法。
以下方法只有在包含该方法的类的实例(所谓的 描述符 类)出现在一个 主人 类(描述符必须在所有者的类字典中或其父类的类字典中)。
我的理解是,这意味着有某种神奇的力量在发挥作用,要求 __get__
要在类中定义(在本例中是函数)。如果你把它添加到一个实例中就不行了。我猜Python在定义描述符类时必须做某种初始化。