Bestimmen Sie, ob __getattr__ ein Methoden- oder Attributaufruf ist

8

Gibt es eine Möglichkeit, den Unterschied zwischen einer Methode und einem Attributaufruf mit __getattr __?

zu bestimmen?

i.e. in:

%Vor%

Die Methoden sind nicht lokal, daher ist es nicht möglich, sie mit getattr / callable zu ermitteln. Ich verstehe auch, dass Methoden Attribute sind und dass es möglicherweise keine Lösung gibt. Ich hoffe nur, dass es einen gibt.

    
Robin Orheden 21.11.2013, 12:26
quelle

2 Antworten

8

Sie können gar nicht sagen, wie ein Objekt im Hook __getattr__ verwendet wird. Sie können auf Methoden zugreifen, ohne sie aufzurufen, sie in einer Variablen speichern und sie beispielsweise später aufrufen.

Gibt ein Objekt mit einer __call__ -Methode zurück, wird es aufgerufen, wenn es aufgerufen wird:

%Vor%

aber Instanzen davon sind nicht dasselbe wie eine Zeichenfolge oder eine Liste zur gleichen Zeit.

Demo:

%Vor%     
Martijn Pieters 21.11.2013, 12:28
quelle
0

Kurz gesagt, nein, es gibt keinen zuverlässigen Weg - das Problem ist, dass eine Methode ein Attribut in Python ist - es gibt keine Unterscheidung. Es ist einfach ein Attribut, das eine gebundene Methode ist.

Sie können überprüfen, ob das Attribut eine Methode ist, aber es gibt keine Garantie, dass es aufgerufen wird, z. B .:

%Vor%

Es gibt keine Möglichkeit für den Aufruf, auf die Funktion zuzugreifen, um zu wissen, ob sie bei der Rückgabe aufgerufen wird - das ist ein zukünftiges Ereignis, das noch nicht verarbeitet wurde.

Wenn Sie davon ausgehen, dass eine Methode, auf die zugegriffen wird, eine Methode ist, die aufgerufen wird, können Sie feststellen, dass auf eine Methode zugegriffen wird, die wie folgt aussieht:

%Vor%

Dabei ist value das Attribut, das Sie überprüfen möchten, um festzustellen, ob es sich um eine Methode oder ein anderes Attribut handelt, und self ist die Instanz, die Sie sehen möchten, wenn es sich um eine Methode handelt.

Wenn Sie möchten, dass etwas passiert, wenn es aufgerufen wird, können Sie diesen Moment verwenden, um die Funktion zu dekorieren.

Ein solides Codebeispiel hierzu finden Sie hier .

    
Gareth Latty 21.11.2013 12:31
quelle

Tags und Links