3 回答
TA贡献1906条经验 获得超3个赞
你似乎缺少的一点是,在Python 3中,“未绑定方法”类型已经完全消失了 - 一个方法,除非它被绑定,只是一个函数,没有用于执行的奇怪的“类型检查”未绑定方法。这使语言更简单!
以机智...:
>>> class X:
... def Y(self): pass
...
>>> type(X.Y)
<class 'function'>
瞧 - 一个不那么微妙的概念和区别担心。这种简化是Python 3与Python 2的核心优势,它(多年来)已经累积了如此多的微妙之处,以至于它们处于危险之中(如果功能一直被添加到其中)真正失去了它作为一种简单语言的地位。使用Python 3,简单性又回来了! - )
TA贡献1877条经验 获得超1个赞
从python 3.6开始,您可以使用定义__set_name__方法的装饰器完成您所描述的内容。文档说明了object.__set_name__在创建类时调用的文档。
下面是一个装饰方法的示例“为了在一个服务于特定目的的方法列表中注册它”:
>>> class particular_purpose:
... def __init__(self, fn):
... self.fn = fn
...
... def __set_name__(self, owner, name):
... owner._particular_purpose.add(self.fn)
...
... # then replace ourself with the original method
... setattr(owner, name, self.fn)
...
... class A:
... _particular_purpose = set()
...
... @particular_purpose
... def hello(self):
... return "hello"
...
... @particular_purpose
... def world(self):
... return "world"
...
>>> A._particular_purpose
{<function __main__.A.hello(self)>, <function __main__.A.world(self)>}
>>> a = A()
>>> for fn in A._particular_purpose:
... print(fn(a))
...
world
hello
添加回答
举报