-1

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

派生类设置这个装饰器最干净的方法是什么,它必须应用于基类方法?我尝试了一些类似的方法,但没有成功,因为要装饰的方法已经绑定:

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
4

1 回答 1

1

简短的版本是:您在这里想要的实际上与静态方法相同,这是解决它的最简单方法。


问题不在于方法 ,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是明确的问题。

于 2013-09-25T17:56:12.520 回答