简短的版本是:您在这里想要的实际上与静态方法相同,这是解决它的最简单方法。
问题不在于方法 ,self.post
是绑定的,而是装饰器 , 是绑定的self.decorator
。
当您将函数存储为类属性时,这与定义新方法基本相同。所以访问它self.decorator
会让你得到一个绑定的方法。(如果你不明白为什么,要么阅读Descriptor HowTo,要么相信它。)这意味着它将以它self
作为它的第一个参数来调用。
你总是可以添加一个显式self
参数decorator
然后忽略它……但是如果你想要一个没有self
参数的方法,那正是静态方法的本质:当用作方法时,它不需要魔法self
。所以:
class Derived(Base):
@staticmethod
def decorator(func):
whatever(fund)
… 或者:
class Derived(Base):
decorator = staticmethod(whatever)
如果您真的想查找decorator
数据属性,即使它是一个函数,最简单的方法是将其移动到实例中:
class Derived(Base):
def __init__(self, *args, **kwargs):
self.decorator = whatever
super(Derived, self).__init__(*args, **kwargs)
或者,当然,您可以反转描述方法:
self.post = self.decorator.im_func(self.post)
…或者只是通过手动查找来避免它:
decorator = type(self).__dict__['decorator']
self.post = decorator(self.post)
这些都是hacky,但是你正在尝试做一些hacky,所以我不认为hackiness是明确的问题。