2016-04-02 10 views
1

Ich muss eine Methode auf einem super() Objekt nach Name finden. Dies funktioniert bei Verwendung der Notation "Punktoperator": super(self.__class__,self).p. Allerdings muss ich das dynamisch machen, etwa super(self.__class__,self)["p"], was nicht funktioniert.Dynamische Methode Auflösung auf einem super() -Objekt

Ich habe versucht, __getattr__ zu verwenden, aber Super-Objekt hat diese Methode nicht. Und super(self.__class__,self).__getattribute__("p") gibt self.p statt super().p zurück.

Wie geht das richtig und elegant?

Zum Beispiel:

class A(object): 
    def p (self): 
     skip 

class B(object): 
    def p (self): 
     skip 

class AB (A,B): 
    def p (self): 
     skip 

ab = AB() 
o = super(ab.__class__, ab) 

print dir(o) 
print o.__getattribute__("p").__code__ 
print o.p.__code__ 

Dieser Code gibt:

['__class__', '__delattr__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__ 
', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__'] 
<code object p at 000000000205f2b0, file "b.py", line 10> # AB.p 
<code object p at 0000000000361cb0, file "b.py", line 2> # A.p 
+1

... was? Können Sie ein weniger abstraktes Beispiel dafür geben, was Sie erreichen möchten? Auch die Übergabe von 'self .__ class__' an' super' ist eine schlechte Idee (siehe z. B. http://stackoverflow.com/q/4235078/3001761). – jonrsharpe

+0

@jonrsharpe Er verwendet nicht selbst .__ class__ in der Klasse. Es wird kein Problem verursachen. – Bharel

+0

@Bharel eigentlich können wir nicht sehen, ob sie sind oder nicht, wegen des ach-so-hilfreichen 'snip'. Aber es scheint seltsam, 'ab .__ class__' anstelle von' AB' zu verwenden. – jonrsharpe

Antwort

2

Was Sie suchen ist getattr(). Dies funktioniert:

>>> getattr(o, "p") 
<bound method A.p of <__main__.AB object at 0x0000000000AA8160>> 

Durch die Verwendung von __getattribute__() direkt, verlieren Sie das Einwickeln super() tut auf das Objekt. Sie sollten immer getattr() verwenden, um Methoden oder andere Attribute abzurufen. Im Allgemeinen wird davon abgeraten, direkt zu __dunder__ Methoden zu gehen, wenn es andere Optionen gibt.

+0

Genau, vielen Dank. Ich habe viel Zeit damit verbracht, herauszufinden, wie das geht, aber ohne Erfolg. – xarx

Verwandte Themen