Оскільки це питання було спочатку задане, python змінив спосіб реалізації абстрактних класів. Я використав дещо інший підхід, використовуючи формалізм abc.ABC у python 3.6. Тут я визначаю константу як властивість, яка повинна бути визначена у кожному підкласі.
from abc import ABC, abstractmethod
class Base(ABC):
@property
@classmethod
@abstractmethod
def CONSTANT(cls):
return NotImplementedError
def print_constant(self):
print(type(self).CONSTANT)
class Derived(Base):
CONSTANT = 42
Це змушує похідний клас визначати константу, інакше TypeError
виникне виняток при спробі створити екземпляр підкласу. Коли ви хочете використовувати константу для будь-якої функціональності, реалізованої в абстрактному класі, ви повинні отримати доступ до константи підкласу type(self).CONSTANT
замість просто CONSTANT
, оскільки значення не визначено в базовому класі.
Є й інші способи реалізації цього, але мені подобається цей синтаксис, оскільки він здається мені найбільш простим і очевидним для читача.
Попередні відповіді торкалися корисних моментів, але я вважаю, що прийнята відповідь не відповідає безпосередньо на питання, тому що
- Питання вимагає реалізації в абстрактному класі, але прийнята відповідь не відповідає абстрактному формалізму.
- Питання ставить питання про те, що імплементація виконується. Я міг би стверджувати, що примусове застосування є жорсткішим у цій відповіді, оскільки воно спричиняє помилку виконання, коли підклас створюється за допомогою екземпляра, якщо
CONSTANT
він не визначений. Прийнята відповідь дозволяє створити екземпляр об'єкта і видає помилку лише при CONSTANT
доступі, роблячи застосування менш жорстким.
Це не винні оригінальні відповіді. Основні зміни в синтаксисі абстрактного класу відбулися з часу їх публікації, що в цьому випадку дозволяє більш акуратну та функціональну реалізацію.