2017-12-13 3 views
1

Ich bin gespannt, wie attrs mit abstract classes kombiniert werden kann. Ich möchte eine abstrakte Klasse definieren, die abstrakte Eigenschaften definiert, die jede erbende Klasse haben muss.Python - attrs Klasse erbt von der abstrakten Klasse

Ich möchte attrs für diese erbende Klasse verwenden, um seine Eigenschaften zu definieren. Also habe ich versucht, ein wenig mit den beiden Spielen:

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 

wirft die folgende Fehlermeldung:

AttributeError: can't set attribute 

Vielleicht gibt es eine Möglichkeit, eine Eigenschaft zu erklären abstrakt mit attrs sein ?:

@attr.s() 
class Parent(object): 
    __metaclass__ = abc.ABCMeta 
    x = attr.ib(abstract=True) 

Wenn ich einen besseren Weg finde, die Vorteile der beiden Module zu nutzen, bin ich sehr dankbar!

Vielen Dank im Voraus!

+0

Dies scheint auf https://github.com/python-attrs/attrs/issues/293 und https://github.com/python-attrs/attrs/issues/303 zu verweisen, oder? – hynek

Antwort

0

Nun, beachten Sie, dass x = attr.ib() keine Eigenschaft erstellt; es setzt ein Attribut.

Ihr Beispielcode schlägt bei c = Child(9) fehl, denn wenn attrs versucht, das Attribut festzulegen, schlägt es fehl, da das Attribut schreibgeschützt ist, wie von ABC definiert (da es keinen Setter enthielt).

Die Attribute, die von attrs gesetzt werden, werden als "Instanzvariablen" bezeichnet. Es gibt keinen Mechanismus in abstrakten Basisklassen (von dem ich weiß, dass er selbst in Python 3 bekannt ist), um Instanzvariablen als Teil der abstrakten Schnittstelle zu beschreiben.

Es gibt also keinen inherrenden Konflikt zwischen attrs und ABCs, aber attrs Attribute sind keine Eigenschaften.

Verwandte Themen