用参数继承类方法装饰器[重复]

Posted

技术标签:

【中文标题】用参数继承类方法装饰器[重复]【英文标题】:Inherit class method decorator with parameter [duplicate] 【发布时间】:2019-06-10 16:32:22 【问题描述】:

我有一个基类,我想在其中定义一个装饰器。该装饰器应该用于继承类。

class Upper(object):
    def model_definition(self, name):
        def func(create_function):
            if self.loading:
                model = self.load(name)
            else:
                model = create_function()

            self.models[name] = model
            return model
        return func

class Lower(Upper):
    @Upper.model_definition(name='example_model'):
    def define_model(self):
        [...]
        return model

当这样做时,我收到消息model_definition() missing 1 required positional argument: 'self'。正确的做法是什么?

【问题讨论】:

也相关:***.com/questions/2365701/… 【参考方案1】:

model_definition 方法需要一个实例,这就是参数self 所代表的含义。 现在,为了在实例上使用装饰器,您可以简单地将实例作为参数传递。这是一个装饰器是静态的示例:

class Upper(object):
    def __init__(self):
        self.model = None

    @staticmethod
    def model_definition(name=''):
        def func(f):
            def wrapper(*args):
                self = args[0]
                print('I am defining the model')
                if not self.model:
                    self.model = name
                return f(*args)

            return wrapper

        return func

class Lower(Upper):
    def __init__(self):
        Upper.__init__(self)
        self.define_model()

    @Upper.model_definition(name='example_model')
    def define_model(self):
        print('The model is : ', self.model)

主要:

l = Lower()

我正在定义模型

('模型是:', 'example_model')

【讨论】:

如果你只是使用静态方法作为装饰器,为什么要把它放在一个类中呢? 可读性和逻辑性。我想这就是为什么你仍然有 @staticmethod 装饰器的原因。但是,装饰器确实可以在类之外定义。

以上是关于用参数继承类方法装饰器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

装饰类的继承类方法中的 cls 行为

TypeScript装饰器

作为基类一部分的 Python 装饰器不能用于装饰继承类中的成员函数

理解Python装饰器

装饰器、装饰器类与类装饰器(三)

TypeScript(21): 装饰器