Python 什么';将装饰器从派生类添加到基类的最干净的方法是什么?
我有一组不同的类,它们共享大部分功能。它们的差异可以在单个方法中隔离,也可以在应用于其中一个基本方法的装饰器中隔离 对于派生类来说,设置这个必须应用于基类方法的decorator最干净的方法是什么?我尝试了这些方法,但没有成功,因为装饰的方法已经确定:Python 什么';将装饰器从派生类添加到基类的最干净的方法是什么?,python,class,python-decorators,Python,Class,Python Decorators,我有一组不同的类,它们共享大部分功能。它们的差异可以在单个方法中隔离,也可以在应用于其中一个基本方法的装饰器中隔离 对于派生类来说,设置这个必须应用于基类方法的decorator最干净的方法是什么?我尝试了这些方法,但没有成功,因为装饰的方法已经确定: class Base(other): decorator = lambda x:x def __init__(self, *args, **kwargs): self.post = self.decorator(
class Base(other):
decorator = lambda x:x
def __init__(self, *args, **kwargs):
self.post = self.decorator(self.post)
super(Base, self).__init__(*args, **kwargs)
def post(self):
pass
class Derived(Base):
decorator = some_decorator
简短的版本是:这里您想要的实际上是与静态方法相同的东西,这是解决它的最简单的方法
问题不在于绑定了方法
self.post
,而在于绑定了修饰符self.decorator
当您将函数存储为类属性时,这与定义新方法基本相同。因此,以self.decorator
的身份访问它将获得一个绑定方法。(如果你不明白为什么,要么阅读,要么信以为真。)这意味着它将以self
作为第一个参数调用
您总是可以将显式的self
参数添加到decorator
中,然后忽略它……但是如果您想要一个没有self
参数的方法,这正是静态方法的含义:当用作方法时,它不需要魔法self
。因此:
class Derived(Base):
@staticmethod
def decorator(func):
whatever(fund)
…或:
class Derived(Base):
decorator = staticmethod(whatever)
如果确实希望将
装饰器
作为数据属性查找,即使它是一个函数,简单的方法是将其移动到实例:
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)
这些都是黑客行为,但是你试图做一些黑客行为,所以我认为黑客行为是明确的不是问题。你的问题不是很清楚。它以什么方式不起作用?你能举一个你想发生什么的例子吗?你是说派生类应该继承基类方法,但使用不同的修饰符?派生类用于继承基类的内容,而你正试图以其他方式来做。@hcwhsa:他试图重写基类行为,这在子类中是完全合理的。这不是最常见的方法,但也不是倒退。