2017-12-13 16 views
1

私は好奇心が強いですattrsabstract classesと組み合わせることができます。 私は抽象クラスを定義する必要があります。抽象クラスは、すべての継承クラスに必要な抽象プロパティを定義します。Python - 抽象クラスから継承するattrsクラス

プロパティを定義するために、この継承クラスにattrsを使用します。

AttributeError: can't set attribute 

おそらく抽象使っattrsに?:

@attr.s() 
class Parent(object): 
    __metaclass__ = abc.ABCMeta 
    x = attr.ib(abstract=True) 
するプロパティを宣言するための方法がある:

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 

は、次のエラーが発生します。だから私は両方で少し遊んでみました

2つのモジュールの利点を得るためのより良い方法を見つけたら、私はとても感謝しています!

事前に感謝します。

+0

これはhttps://github.com/python-attrs/attrs/issues/293とhttps://github.com/python-attrs/attrs/issues/303を暗示しているようです。 – hynek

答えて

0

まあ、x = attr.ib()はプロパティを作成していないことに注意してください。それは属性を設定しています。

attrsが属性を設定しようとするとABCで定義されているように属性が読み取り専用であるため(setterを含まないため)、失敗します。c = Child(9)でコードが失敗します。

属性はattrsで設定され、「インスタンス変数」とみなされます。抽象インターフェースの一部としてインスタンス変数を記述するための抽象基本クラス(私は、Python 3でさえ知っている)の仕組みはありません。

したがって、attrsとABCの間に継承の競合はありませんが、attrsの属性はプロパティではありません。

関連する問題