2016-02-11 2 views
2

можно использовать abc.abstractproperty для создания конкретного геттера, но сделать абстрактную сеттерную, чтобы он отличался для каждого из наследующих классов. Я обрабатываю значение val для каждого подкласса.python абстрактное свойство setter с бетонным геттером

например.

@abstractproperty 
def val(self): 
    return self._val 

@val.setter 
def val(self, x): 
    pass 

ответ

2

Как я в конечном итоге делает это.

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): 
     ... 
+0

Какую версию python вы используете? – Hagai

+0

@Hagai Я использовал 3.5 –

+0

Спасибо, не работает на 2,7 к сожалению – Hagai

4

Вам понадобится немного косвенности. Определите сеттер как обычно, но попросите его абстрактный метод, который выполняет фактическую работу. Затем каждому дочернему классу необходимо предоставить определение , что метод. Например,

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 
Смежные вопросы