[英]python abstract property setter with concrete getter
是否可以使用abc.abstractproperty
创建一个具体的 getter,但使 setter 抽象,因此每个继承类都不同。 我为每个子类处理不同的 val 设置。
例如。
@abstractproperty
def val(self):
return self._val
@val.setter
def val(self, x):
pass
你需要一点间接性。 像往常一样定义 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
然后
>>> c = Child()
>>> print c.val
3
>>> c.val = 9
>>> print c.val
18
我是怎么做到的。
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):
...
@abstractmethod
def my_abstract_method(self, ...):
...
@classmethod
@abstractmethod
def my_abstract_classmethod(cls, ...):
...
@staticmethod
@abstractmethod
def my_abstract_staticmethod(...):
...
@property
@abstractmethod
def my_abstract_property(self):
...
@my_abstract_property.setter
@abstractmethod
def my_abstract_property(self, val):
...
@abstractmethod
def _get_x(self):
...
@abstractmethod
def _set_x(self, val):
...
x = property(_get_x, _set_x)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.