4

我很好奇attrs如何与抽象类结合使用。我想定义一个抽象类,它定义了每个继承类必须具有的抽象属性。

我想为这个继承类使用 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)

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

提前谢谢了!

4

1 回答 1

2

好吧,请注意,这x = attr.ib()不是创建属性;它正在设置一个属性。

您的示例代码在 处失败c = Child(9),因为当attrs尝试设置属性时,由于属性是只读的,如 ABC 所定义(因为它不包含设置器),它会失败。

所设置的属性是attrs人们认为的“实例变量”。抽象基类(我知道,即使在 Python 3 中)中没有将实例变量描述为抽象接口的一部分的机制。

所以这里没有attrs和 ABC 之间的内在冲突,但attrs属性不是属性。

于 2018-02-08T21:28:08.987 回答