2017-06-13 1 views
0

Gibt es eine pythonische Möglichkeit, die Ausgaben einer Methode in einer Kindklasse von der Elternklasse zu überprüfen.Wie die Ausgabe von einer Methode in der Kindklasse überprüft wird, hat die richtige Größe

Zum Beispiel, wenn Sie diese Struktur haben, möchte ich eine Überprüfung (in der Elternklasse) auf die Ausgabe von der Methode 'generieren' in der Kindklasse (z. B. wenn es die richtige Form hat).

class parent_class(object): 

    def generate(self): 
     raise NotImplementedError 

class child_class(parent_class): 

    def generate(self, array_size): 
     return np.random.uniform(size = [10,10]) 

Nachfolgend erreicht die richtige Wirkung, erfordert aber die Methode check_class im init Methode des Kindes Klasse aufrufen. Gibt es eine Möglichkeit, diese Überprüfung zu erreichen, ohne daran zu denken, den Aufruf der Methode 'check_class' in jeder untergeordneten Klasse durchzuführen?

class parent_class(object): 

    def generate(self, size): 
     raise NotImplementedError 

    def check_class(self): 
     assert self.generate([5,5]).shape == (5,5), 'Output of generate has the wrong shape' 

class child_class(parent_class): 

    def __init__(self): 
     self.check_class() 

    def generate(self, size): 
     return np.random.uniform(size = [10,10]) 

Wenn Sie erzeugen aufrufen, wird diese nun die Größe der Ausgabe überprüfen ist richtig, je nach Bedarf:

a = child_class() 

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-58-389a5f325aca> in <module>() 
----> 1 a = child_class() 

<ipython-input-56-99054bf26f0e> in __init__(self) 
10 
11  def __init__(self): 
---> 12   self.check_class() 
13 
14  def generate(self, size): 

<ipython-input-56-99054bf26f0e> in check_class(self) 
    5 
    6  def check_class(self): 
----> 7   assert self.generate([5,5]).shape == (5,5), 'Output of generate has the wrong shape' 
    8 
    9 class child_class(parent_class): 

AssertionError: Output of generate has the wrong shape 
+0

Was ist die Absicht, wann wird die Validierungsprüfung durchgeführt? –

+0

Die Überprüfung kann durchgeführt werden, wenn die Kindklasse instanziiert wird (wie in der obigen Arbeit) oder wenn die Methode aufgerufen wird - beides wäre in Ordnung! – fjhj2

+0

könnten Sie die Kindklasse mit der Elternklassenmethode dekorieren? –

Antwort

0

Sie die Prüfung bei der Instanzerstellung Wert einstellen (__new__()), so dass es immer ausführt, zum Beispiel:

class Parent(object): 

    def __new__(cls, *args, **kwargs): 
     instance = super(Parent, cls).__new__(cls) # create our instance 
     instance.check() # immediately call check on it 
     return instance # return it to the requestor 

    def check(self): 
     assert self.generate() == 10, "generate() must return 10" 

    def generate(self): 
     raise NotImplementedError 

class Child(Parent): 

    def generate(self): 
     return 10 

class BadChild(Parent): 

    def generate(self): 
     return 20 


child = Child() 
# everything's fine... 

parent = Parent() 
# NotImplementedError 

bad_child = BadChild() 
# AssertionError: generate() must return 10 

Sie auch metaclasses verwenden können, aber nicht dorthin gehen, wenn Sie es nicht brauchen.

Als eine Randnotiz, ich hoffe, Sie tun dies nicht als eine Art API für Ihr Modul, tho. Schreiben Sie nicht Javaesque Python - Behandeln Sie die Benutzer Ihres Moduls als Erwachsene und machen Sie deutlich, was Ihr Modul erwartet.

Verwandte Themen