2017-11-01 4 views
1

Ich möchte für Child-Prozess bestimmte Eigenschaften haben, aber da Sie untergeordnete Methoden nicht erben können, den Property Decorator, möchte ich zumindest behaupten, dass diese Attribute des Kindes sind Eigenschaften der Klasse.Assert Kind Attribut ist Eigentum von Elternklasse

Etwas wie folgt aus:

class Parent: 
    def __init__(self): 
     assert isinstance(self.foo, property) 

    def foo(self): 
     raise NotImplementedError 

class Child(Parent): 
    def __init__(self): 
     super().__init__() 

    @property 
    def foo(self): 
     return 'bar' 

Aber natürlich durch die Zeit Parent.__init__() ausgeführt wird, hat self.foo'bar' geworden und es gibt eine AssertionError. Gibt es eine Möglichkeit zu erreichen, was ich für die Verwendung von Meta-Klassen tun werde? Wenn ja, kann es sein, dass die Klasse Parent diejenige ist, die die Metaklasse erbt, nicht die Child?

+0

Warum nicht https://docs.python.org/3/library/abc.html#abc.abstractproperty verwenden? – jonrsharpe

+0

Ahh, perfekt. Einreichen und antworten und ich werde es akzeptieren – v4gil

+0

Eigentlich sieht das gut aus, aber ich kann es nicht zum Laufen bringen. abc.abstractproperty ist veraltet und sagt abstractmethod mit property. Ich kann es nicht bekommen, um einen Fehler zu verursachen. – v4gil

Antwort

0

Ich fand eine Lösung. Statt testen, ob self.foo eine Eigenschaft ist, die ich getestet habe, ob es nicht eine gebundene Methode war:

from inspect import ismethod 

class Parent: 
    def __init__(self): 
     assert not ismethod(self.foo, property) 

    def foo(self): 
     raise NotImplementedError 

Dies wird in den meisten Fällen funktionieren, aber fehlschlagen, wenn die Eigenschaft von Child.foo zurückgegeben wird, ist selbst eine gebundene Methode. Offen für umfassendere Antworten.

Verwandte Themen