0

我正在处理python中的一些代码,这些代码需要某些抽象基类的子类对象来实现属性。根据本网站上的其他帖子和建议以及其他流行方法是使用@propertyABC 中的装饰器。但是,此方法不需要实际对象在初始化时具有该属性,只需@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

有没有更好的方法来检查子类是否履行了包含指定属性的合同?

4

0 回答 0