Абстрактное свойство Python
При изучении абстрактного класса, я столкнулся с вопросом про абстрактное свойство класса родителя.
Пример кода:
import abc
from abc import ABC, abstractmethod
class parent(ABC):
@abc.abstractproperty
def someMethod(self):
return "parent class"
class child(parent):
@property
def someMethod(self):
return "child class"
try:
obj = parent()
print(obj.someMethod)
except Exception as ex:
print(ex)
obj = child()
print(obj.someMethod)
Результат:
Can't instantiate abstract class parent without an implementation for abstract method 'someMethod'
child class
Если мы используем @abstractproperty
, то требуем атрибуты в родительском классе?
UPD: Судя по интерпретатору, мы можем создать экземпляр дочернего класса, но не родительского? Даже с одинаковой семантикой?
Ответы (1 шт):
Используя декоратор @abstractmethod
перед определенным методом, мы указываем, что данный метод родительского класса является абстрактным и требует реализации со стороны дочернего класса. Также указав декоратор @property
, мы можем преобразовать метод в свойство класса.
Пример использования декоратора @abstractmethod
без реализации в дочернем классе:
import abc
from abc import ABC, abstractmethod
class parent(ABC):
@abstractmethod #декоратор, который указывает, что "someMethod" главный метод в супер классе
def someMethod(self):
return "parent class"
class child(parent):
pass #нет переопределения супер метода
obj = child()
print(obj.someMethod)
Результат:
TypeError: Can't instantiate abstract class child without an implementation for abstract method 'someMethod'
Пример использования декоратора @abstractmethod
с реализацией метода в дочернем классе:
import abc
from abc import ABC, abstractmethod
class parent(ABC):
@abstractmethod
def someMethod(self):
return "parent class"
class child(parent):
def someMethod(self):
return "child class"
obj = child()
print(obj.someMethod())
Результат:
child class
Использование @property
:
print(obj.someMethod)
Без декоратора:
print(obj.someMethod())