为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2019-09-02 16:08:06
假设我想为类中定义的方法创建装饰器。我希望装饰器在被调用时能够在定义方法的类上设置属性(以便将其注册到用于特定目的的方法列表中)。在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的功能,如果没有,那么完全删除它的理由是什么。
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

你似乎缺少的一点是,在Python 3中,“未绑定方法”类型已经完全消失了 - 一个方法,除非它被绑定,只是一个函数,没有用于执行的奇怪的“类型检查”未绑定方法。这使语言更简单!


以机智...:


>>> class X:

...   def Y(self): pass

... 

>>> type(X.Y)

<class 'function'>

瞧 - 一个不那么微妙的概念和区别担心。这种简化是Python 3与Python 2的核心优势,它(多年来)已经累积了如此多的微妙之处,以至于它们处于危险之中(如果功能一直被添加到其中)真正失去了它作为一种简单语言的地位。使用Python 3,简单性又回来了! - )


查看完整回答
反对 回复 2019-09-02
?
冉冉说

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


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 586 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信