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

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

在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。但是,我很好奇第二版功能是否有替代品,如果没有,那么完全删除它的理由是什么。

编辑:我刚刚找到this question。这使得似乎最好的解决方案就是像我一样避免这样做。我仍然想知道为什么将其删除。

参考方案

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

以机智...:

>>> class X:
...   def Y(self): pass
... 
>>> type(X.Y)
<class 'function'>

和瞧-一个更微妙的概念和需要担心的区别。这样的简化是Python 3与Python 2的核心优势,多年来,Python 2积累了许多微妙之处,以至于有可能真的失去其简单语言的地位(如果不断添加功能) 。有了Python 3,简单又回来了!-)

在python 3中使用单引号和双引号时出错 - python

使用os.system()函数时,我在python中遇到了EOL错误。以下是代码行生成错误:os.system("cat subdomains.txt | cut -d'"' -f1 ") 基本上,我试图使用分号[“]修改输出字符串(双引号) 参考方案 如果需要在带"的字符串中编写",则可…

在python-nvd3中的y轴上显示大量数字 - python

在y轴上显示大量数字的一种方法是移动边距:Y axis label not displaying large numbers - Multi-Bar Chart。如何调整python-nvd3中的margin参数?您能代替写10 ^ 6这样的顶部指数并将y轴标记为2.5,3.0等吗,而不是写25,00,000,30,00,000等。 参考方案 如果我正确理解…

在python ephem中,我无法获得某些星座的位置 - python

import ephem date = '2018/9/20' sun = ephem.Sun() sun.compute(date) print 'Sun in', list(ephem.constellation(sun))[1] moon = ephem.Moon() moon.compute(date) pri…

找不到满足要求pip的版本-在python 2.7中的代理后面安装pip - python

我在实际要安装pip的地方使用Phyton 2.7,因此我从网站上获取了get-pip.py并尝试使用此命令安装pip:python get-pip.py 但是经过多次重试并显示此问题后它失败了Could not find a version that satisfies the requirement pip 我在不同的论坛上搜索,发现可能存在代理问题,因…

在python flask应用程序中进行单元测试时如何避免装饰器 - python

我是python和flask的新手。我想为编写的api创建单元测试。我们已经使用jwt进行身份验证。为了进行单元测试,我不想让流程进入@jwt_required装饰器。除此之外,我还为该方法链接了其他一些装饰器。class A(): @jwt_required() @mandatory_fields_check @unlock_and_lock() def …