我正在处理python中的一些代码,这些代码需要某些抽象基类的子类对象来实现属性。根据本网站上的其他帖子和建议以及其他流行方法是使用@property
ABC 中的装饰器。但是,此方法不需要实际对象在初始化时具有该属性,只需@property
在子类中实现该方法即可。
class ABCFoo(ABC):
depth= NotImplemented
@property
@abstractmethod
def someAttribute(self):
raise NotImplementedError
class Foo(ABCFoo):
def __init__(self,otherAttribute):
self._otherAttribute=otherAttribute
@property
def someAttribute(self):
return self._someAttribute
@property
def otherAttribute(self):
return self._otherAttribute
在上面的代码中,Foo
可以在方法someAttribute
存在时初始化类,但是在调用时会抛出属性错误。如果这发生在一些计算量大的代码的末尾,这可能是一个问题,如果早点检测到,这本可以避免。
foo=Foo(3)
computationallyExpensiveMethod(foo)
foo.someAttribute
输出
AttributeError: 'Foo' object has no attribute '_someAttribute'
如果使用了装饰器,则Protocol
类 fromtyping
可以检查对象中的属性,但是如果显式继承子类,则这不起作用,仅用于隐式子类型化。isinstance
@runtime_checkable
有没有更好的方法来检查子类是否履行了包含指定属性的合同?