Абстрактные сеттеры и геттеры Python

Я хочу написать абстрактный класс, который заставит наследующие классы реализовать все методы и свойства в моем абстрактном классе.

Кроме того, я хочу использовать сеттеры и геттеры для моего абстрактного свойства, чтобы сделать мой код незагроможденным и красивым.

Однако текущая реализация:

import abc


class Component(metaclass=abc.ABCMeta):

    @property
    @abc.abstractmethod
    def status(self):
        pass

    @property
    @status.setter
    @abc.abstractmethod
    def status(self, value):
        pass

принуждает класс наследования реализовать геттер для моего абстрактного геттера свойств, но не принуждает создавать установщик свойства (что именно я и хочу)

Как я могу добиться такого поведения, не теряя всех преимуществ от применения дальнейшего упомянутого метода (т. е. написания новых методов и их выполнения в моем установщике абстрактного класса)?


person Jakub Pastuszuk    schedule 28.11.2018    source источник


Ответы (1)


из abc импортировать ABCMeta, abstractmethod

Базовый класс (объект): метакласс = ABCMeta

def __init__(self, val):
    self._foo = val

@abstractmethod
def _doStuff(self, signals):
    print ('Base does stuff')

@abstractmethod
def _get_foo(self):
    return self._foo

@abstractmethod
def _set_foo(self, val):
    self._foo = val + 'r'

foo = property(_get_foo, _set_foo)

класс floor_1 (базовый): метакласс = ABCMeta

def __init__(self, val):
    self._foo = val
    super(floor_1, self).__init__(val)

def _doStuff(self, signals):
    print ('floor_1 does stuff')

def _get_foo(self):
    return self._foo

def _set_foo(self, val):
    #self._foo = val + 'r'
    super()._set_foo(val + 'r')

foo = property(_get_foo, _set_foo)

класс этаж_2(этаж_1):

@property
def foo(self):
    return self._foo

@foo.setter
def foo(self, val):
    self._foo = val + 'r'
    #super()._set_foo(val + 'r')

b1 = пол_1 («бар»)

b1 = пол_2 («бар»)

print(b1.foo) b1.foo = 'bar' print(b1.foo)

person Chirag Dave    schedule 11.05.2020