Python - 继承自抽象类的attrs类

时间:2017-12-13 14:48:52

标签: python python-attrs

我很好奇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)

如果有人找到更好的方法来获得这两个模块的好处,我将非常感激!

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

嗯,请注意x = attr.ib()没有创建属性;它设置了一个属性。

您的示例代码在c = Child(9)处失败,因为当attrs尝试设置属性时,由于属性为只读属性而失败,因为ABC已定义(因为它没有&#39} ;包括一个二传手。)

attrs设置的属性是人们认为的"实例变量"。 Abstract Base Classes中没有机制(我甚至在Python 3中都知道)将实例变量描述为抽象接口的一部分。

因此attrs和ABCs之间没有任何继承冲突,但attrs属性不是属性。