Я пытался проверить классы, которые пользователи могут создавать в настройках стиля фреймворка. Я могу гарантировать, что атрибут класса присутствует в дочерних классах следующим образом:
from abc import ABC, abstractmethod
class A(ABC):
@property
@classmethod
@abstractmethod
def s(self):
raise NotImplementedError
class ClassFromA(A):
pass
ClassFromA()
Что приводит к следующему Exception
:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class ClassFromA with abstract methods s
Я также могу проверить типатрибута класса s
во время создания класса с помощью декоратора, например, так:
from abc import ABC, abstractmethod
def validate_class_s(cls):
if not isinstance(cls.s, int):
raise ValueError("S NOT INT!!!")
return cls
class A(ABC):
@property
@classmethod
@abstractmethod
def s(self):
raise NotImplementedError
@validate_class_s
class ClassFromA(A):
s = 'a string'
В результате:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 3, in validate_class_s
ValueError: S NOT INT!!!
Что полезно при возможной проверке атрибутов класса. Но это приводит к подробным определениям классов, где каждый из дочерних классов должен быть оформлен.
Есть ли способ проверки атрибута класса (s
в примерах) в базовом классе? Желательно не слишком многословно?