【问题标题】:Decorator and Inheritance with parameters带参数的装饰器和继承
【发布时间】:2018-09-17 17:08:45
【问题描述】:

有一个带有继承的装饰器。效果很好:

class bar(object):
    def __init__(self,val):
        self.val = val

    @staticmethod
    def decor(func):
        def increment(obj, x):
            return func(obj, x) + obj.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)

    @bar.decor
    def add(self, x):
        return x

但是我想在class foo中添加一个参数:

class foo(bar):
    def __init__(self,B):
        bar.__init__(self)
        self.B = B

我想将B作为参数输入到装饰器中,我试了一下:

class bar(object):
    def __init__(self,val):
        self.val = val

    @staticmethod
    def decor(B):
        def wrap(func):
            def increment(obj, x):
                return func(obj, x) + obj.val + B
            return increment
        return wrap

class foo(bar):
    def __init__(self,B):
        bar.__init__(self)
        self.B = B

    @bar.decor(B)
    def add(self, x):
        return x

但它没有用。我做错了什么?

【问题讨论】:

  • @bar.decor(B) 装饰中你会从哪里得到B
  • class foo(bar)__init__()方法中,self.B = B语句中赋值右侧使用的名为B的变量从何而来?
  • 您尝试做的事情似乎是不可能的。一旦定义了方法,装饰器就会在导入时执行。他们不会等到类的实例被实例化。因此,它们不能依赖于传递给__init__ 的值。

标签: python inheritance parameters decorator


【解决方案1】:
class bar(object):
    def __init__(self, val):
        self.val = val

    @staticmethod
    def decor(func):
        def increment(obj, x):
            return func(obj, x) + obj.val + obj.B
        return increment

class foo(bar):
    def __init__(self,val,B):
        bar.__init__(self,val)
        self.B = B

    @bar.decor
    def add(self, x):
        return x

aa = foo(4, 1.5)
a = aa.add(1)
print(a)

【讨论】:

  • 能否请您至少添加一个简短的解释,您在这里做了什么?它看起来几乎像问题第一部分的逐字副本,不同之处在于内部increment 函数中出现了一个额外的+ obj.B
  • 我只想创建一个装饰器来处理'class foo'的功能,它继承自'class bar',并带有自己的参数B作为装饰器的一部分。
猜你喜欢
  • 2014-03-07
  • 2011-03-01
  • 2011-03-23
  • 2018-04-17
  • 2011-09-18
  • 2017-10-10
  • 1970-01-01
  • 2019-06-10
  • 2021-07-18
相关资源
最近更新 更多