我很好奇attrs如何与abstract classes结合使用。 我想定义一个抽象类,它定义每个继承类必须具有的抽象属性。
我想为这个继承类使用attrs来定义它的属性。所以我尝试了两点:
import abc
import attr
class Parent(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def x(self):
pass
@attr.s()
class Child(Parent):
x = attr.ib()
c = Child(9)
c.x = 7
引发以下错误:
AttributeError: can't set attribute
也许有一种方法可以使用attrs将属性声明为抽象?:
@attr.s()
class Parent(object):
__metaclass__ = abc.ABCMeta
x = attr.ib(abstract=True)
如果有人找到更好的方法来获得这两个模块的好处,我将非常感激!
非常感谢提前!
答案 0 :(得分:0)
嗯,请注意x = attr.ib()
没有创建属性;它设置了一个属性。
您的示例代码在c = Child(9)
处失败,因为当attrs
尝试设置属性时,由于属性为只读属性而失败,因为ABC已定义(因为它没有&#39} ;包括一个二传手。)
由attrs
设置的属性是人们认为的"实例变量"。 Abstract Base Classes中没有机制(我甚至在Python 3中都知道)将实例变量描述为抽象接口的一部分。
因此attrs
和ABCs之间没有任何继承冲突,但attrs
属性不是属性。