假设我想为类中定义的方法制作装饰器。我希望那个装饰器在被调用时能够在定义方法的类上设置一个属性(以便将它注册到服务于特定目的的方法列表中)。
在 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 功能的替代品,如果没有,完全删除它的理由是什么。
编辑:我刚发现 这个问题。这使得最好的解决方案似乎就是像我一样避免它。我仍然想知道为什么它被删除了。
原文由 Tim Yates 发布,翻译遵循 CC BY-SA 4.0 许可协议
您似乎缺少的一点是,在 Python 3 中,“未绑定方法”类型完全消失了——一个方法,直到并且除非它被绑定,只是一个函数,没有用于执行的奇怪的“类型检查”未绑定方法.这使语言更简单!
以机智…:
瞧——一个不那么微妙的概念和需要担心的区别。这种简化是 Python 3 相对于 Python 2 的核心优势,Python 2(多年来)已经积累了如此多的微妙之处,以至于它处于真正失去其作为 简单 语言的地位的危险中(如果不断向其添加特性)。使用 Python 3,简单又 _回来了_!-)