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
... 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
@jonrsharpe Er verwendet nicht selbst .__ class__ in der Klasse. Es wird kein Problem verursachen. – Bharel
@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