Абстрактное свойство 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 шт):

Автор решения: Radiance

Используя декоратор @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())
→ Ссылка