【发布时间】:2020-02-01 08:08:21
【问题描述】:
我一直在尝试验证用户可以在框架样式设置中创建的类。 我可以通过以下方式确保子类中存在类属性:
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)?最好不要用太冗长的方式?
【问题讨论】:
-
理想情况下在类定义时,只是为了凝聚力。但如果一个解决方案只在实例化时可行,我可以调整。
-
不,我试图避免代码重复(这是我可以用我的第二个解决方案做的)并确保类属性的类型/结构(我不能用我的第一个解决方案)。
标签: python python-3.x metaclass python-object