python抽象属性setter与混凝土吸气剂

jac*_*ton 5 python

是否可以使用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)


jac*_*ton 6

我是怎么做到的.

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)