繁体   English   中英

带有具体getter的python抽象属性setter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM