在Python 3中获取未绑定方法对象的定义类

假设我想为类中定义的方法创建装饰器。我希望装饰器在被调用时能够在定义方法的类上设置属性(以便将其注册到用于特定目的的方法列表中)。


在Python 2中,该im_class方法很好地完成了这个:


def decorator(method):

  cls = method.im_class

  cls.foo = 'bar'

  return method

但是,在Python 3中,似乎不存在这样的属性(或替代它)。我想这个想法是你可以调用type(method.__self__)来获取类,但是这对于未绑定的方法不起作用,因为__self__ == None在那种情况下。


注意:这个问题实际上与我的情况有点无关,因为我选择在方法本身上设置属性,然后让实例扫描其所有方法,在适当的时间查找该属性。我(目前)也在使用Python 2.6。但是,我很好奇是否有替换版本2的功能,如果没有,那么完全删除它的理由是什么。


MM们
浏览 587回答 3
3回答

一只名叫tom的猫

你似乎缺少的一点是,在Python 3中,“未绑定方法”类型已经完全消失了 - 一个方法,除非它被绑定,只是一个函数,没有用于执行的奇怪的“类型检查”未绑定方法。这使语言更简单!以机智...:>>> class X:...&nbsp; &nbsp;def Y(self): pass...&nbsp;>>> type(X.Y)<class 'function'>瞧 - 一个不那么微妙的概念和区别担心。这种简化是Python 3与Python 2的核心优势,它(多年来)已经累积了如此多的微妙之处,以至于它们处于危险之中(如果功能一直被添加到其中)真正失去了它作为一种简单语言的地位。使用Python 3,简单性又回来了! - )

冉冉说

从python 3.6开始,您可以使用定义__set_name__方法的装饰器完成您所描述的内容。文档说明了object.__set_name__在创建类时调用的文档。下面是一个装饰方法的示例“为了在一个服务于特定目的的方法列表中注册它”:>>> class particular_purpose:&nbsp;...&nbsp; &nbsp; &nbsp;def __init__(self, fn):&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.fn = fn&nbsp;...&nbsp; &nbsp; &nbsp;&nbsp;...&nbsp; &nbsp; &nbsp;def __set_name__(self, owner, name):&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;owner._particular_purpose.add(self.fn)&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# then replace ourself with the original method&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setattr(owner, name, self.fn)&nbsp;...&nbsp;&nbsp;... class A:&nbsp;...&nbsp; &nbsp; &nbsp;_particular_purpose = set()&nbsp;...&nbsp;&nbsp;...&nbsp; &nbsp; &nbsp;@particular_purpose&nbsp;...&nbsp; &nbsp; &nbsp;def hello(self):&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return "hello"&nbsp;...&nbsp;&nbsp;...&nbsp; &nbsp; &nbsp;@particular_purpose&nbsp;...&nbsp; &nbsp; &nbsp;def world(self):&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return "world"&nbsp;...&nbsp;&nbsp;>>> A._particular_purpose{<function __main__.A.hello(self)>, <function __main__.A.world(self)>}>>> a = A()&nbsp;>>> for fn in A._particular_purpose:&nbsp;...&nbsp; &nbsp; &nbsp;print(fn(a))&nbsp;...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;worldhello
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python