2010-09-03 6 views
7

In PHP, ich kann etwas tun:Python-Äquivalent von PHPs __call() magische Methode?

class MyClass 
{ 
    function __call($name, $args) 
    { 
    print('you tried to call a the method named: ' . $name); 
    } 
} 
$Obj = new MyClass(); 
$Obj->nonexistant_method(); // prints "you tried to call a method named: nonexistant_method" 

Dies würde nützlich sein, die Lage sein, für ein Projekt in Python zu tun, ich arbeite (viele bösen XML zu analysieren, würde es sein, schön, um es in Objekte zu drehen und in der Lage sein, nur Methoden aufrufen.

Does Python einen äquivalenten?

Antwort

12

Definieren Sie eine __getattr__ Methode für Ihr Objekt, und geben Sie eine Funktion (oder eine Schließung) daraus zurück.

In [1]: class A: 
    ...:  def __getattr__(self, name): 
    ...:   def function(): 
    ...:    print("You tried to call a method named: %s" % name) 
    ...:   return function 
    ...:  
    ...:  

In [2]: a = A() 

In [3]: a.test() 
You tried to call a method named: test 
+0

Ziemlich gut, obwohl es auch nützlich sein könnte, die verschachtelte Funktion als 'function (* args)' zu definieren, so dass der Body sowohl den Funktionsnamen als auch alle übergebenen Argumente verwenden kann. Hängt davon ab, was Keith mit den Methoden machen will. (Natürlich wird '__getattr__' selbst dann, wenn es keine Argumente für eine der Methoden geben wird, das Ergebnis zurückgeben und dabei Felder anstelle von Methoden simulieren.) –

+0

Ich möchte tatsächlich die Funktionsargumente als erhalten Gut. Ist die einzige notwendige Änderung def def function(): als Def-Funktion (* args) :? Oder muss ich noch etwas anderes machen? (Python-Neuling, sorry!) –

+0

@Keith: Wenn die Funktion willkürliche Argumente nimmt, dann setze '* args' in die Argumentliste und es wird ein Tupel mit allen Argumenten erhalten. Wenn es sich um eine feste Anzahl von Argumenten handelt, können Sie einfach direkt 'function (a, b) 'definieren, um beispielsweise zwei Argumente zu nehmen. – Juliano

1

Sie wahrscheinlich __getattr__ wollen, obwohl es auf Klassenattribute sowie Methoden funktioniert (weil Methoden nur sind Attribute, die sind Funktionen)

0

Ich war für den gleichen suchen, aber da der Aufruf der Methode ist ein zweistufiger Betrieb wie: * 1. das Attribut zu erhalten (. Obj _ getattr _) * 2. nannte es (obtainedObject. _ Anruf _)

Es gibt keine magische Methode, die beiden Aktionen vorhersagt.

Verwandte Themen