是否可以使用abc.abstractproperty创建一个具体的getter,但使setter抽象,使其对每个继承类都不同.我为每个子类处理val的设置.
例如.
@abstractproperty
def val(self):
return self._val
@val.setter
def val(self, x):
pass
Run Code Online (Sandbox Code Playgroud)
che*_*ner 11
你需要一点间接.像往常一样定义setter,但让它调用一个执行实际工作的抽象方法.然后每个子类都需要提供该方法的定义.例如,
class Base(object):
__metaclass__ = abc.ABCMeta
def __init__(self):
self._val = 3
@property
def val(self):
return self._val
@val.setter
def val(self, x):
self._val_setter(x)
@abc.abstractmethod
def _val_setter(self, x):
pass
class Child(Base):
def _val_setter(self, x):
self._val = 2*x
Run Code Online (Sandbox Code Playgroud)
然后
>>> c = Child()
>>> print c.val
3
>>> c.val = 9
>>> print c.val
18
Run Code Online (Sandbox Code Playgroud)
我是怎么做到的.
class C(metaclass=ABCMeta):
@property
def x(self):
...
@x.setter
@abstractmethod
def x(self, val):
...
class D(C):
@C.x.setter
def x(self, val):
...
Run Code Online (Sandbox Code Playgroud)