Python 什么';将装饰器从派生类添加到基类的最干净的方法是什么?

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(

我有一组不同的类,它们共享大部分功能。它们的差异可以在单个方法中隔离,也可以在应用于其中一个基本方法的装饰器中隔离

对于派生类来说,设置这个必须应用于基类方法的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:他试图重写基类行为,这在子类中是完全合理的。这不是最常见的方法,但也不是倒退。