【问题标题】:Python child class decorator. Why can I qualify decorators with parent class only oncePython 子类装饰器。为什么我只能用父类限定装饰器一次
【发布时间】:2020-11-25 06:31:34
【问题描述】:

我在 python 3.6 中尝试过这段代码

from abc import ABC, abstractmethod

class A(ABC):

  @property
  @abstractmethod
  def prop1(self):
    pass
    
  @prop1.setter
  @abstractmethod
  def prop1(self, val):
    pass

class B(A):
  def __init__(self, val=None):
    self._prop = val

  @A.prop1.setter
  def prop1(self, val):
    if val == "something":
      self._prop = val
    else:
      self._prop = "nothing"

  @A.prop1.getter
  def prop1(self):
    return self._prop

  def do_something(self):
    self.prop1 = "blah"

我收到错误 TypeError: Can't instantiate abstract class B with abstract methods prop1。但是,如果我像这样从覆盖的 getter 中删除 @A,则代码可以正常工作。

@prop1.getter
 def prop1(self):
   return self._prop

此外,getter 高于或低于 setter 并不重要。只有第一个似乎需要@A.。为什么会这样?

【问题讨论】:

    标签: python python-3.x python-decorators


    【解决方案1】:

    在子类中覆盖基类属性时,您根本不需要引用它们

    from abc import ABC, abstractmethod
    
    
    class A(ABC):
    
        @property
        @abstractmethod
        def prop1(self):
            pass
    
        @prop1.setter
        @abstractmethod
        def prop1(self, val):
            pass
    
    
    class B(A):
        def __init__(self, val=None):
            self._prop = val
    
        @property
        def prop1(self):
            return self._prop
    
        @prop1.setter
        def prop1(self, val):
            if val == "something":
                self._prop = val
            else:
                self._prop = "nothing"
    
        def do_something(self):
            self.prop1 = "blah"
    

    【讨论】:

    • 感谢您的回答。但是如果我将用@property 装饰的getter 函数放在setter 函数之后,我会得到错误@prop1 is not defined。似乎涉及某种范围/顺序规则。
    • 变量/函数在定义之前不能使用...
    猜你喜欢
    • 2011-11-20
    • 2021-05-10
    • 2021-07-16
    • 2019-06-28
    • 1970-01-01
    • 2011-04-28
    • 2014-01-14
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多