Ich möchte die Quelldefinition für das Objekt .__ new __() sehen und entschieden, diese schnelle Möglichkeit für den Zugriff auf diesen Code zu verwenden. Warum gibt Python mir eine TypeError (is not a type:method)
, wenn type()
sagt mir, es ist eine Art: Methode?Wie kann ich die Klasse, die getThings() in diesem Beispiel aufrufen soll, dynamisch instanzieren (nach Klassennamen als String)?
(1)
>>> import inspect
>>> print inspect.getsource(object.__new__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 701, in getsource
lines, lnum = getsourcelines(object)
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 690, in getsourcelines
lines, lnum = findsource(object)
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 526, in findsource
file = getfile(object)
File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 420, in getfile
'function, traceback, frame, or code object'.format(object))
TypeError: <built-in method __new__ of type object at 0x10a2d9410> is not a module, class, method, function, traceback, frame, or code object
>>> type(object.__new__)
<type 'builtin_function_or_method'>
>>>
Der Grund, warum ich die Definition in erster Linie sehen wollte, ist, weil die Methode, die ich erfordert eine Instanz einer bestimmten Klasse als erstes Argument zu nennen bin versucht.
(2)
TypeError: unbound method getThings() must be called with FunClass instance as first argument (got SadClass instance instead)
Es ist auch erwähnenswert, dass FunClass eine Unterklasse von SadClass ist, und wie die Fehlermeldung bedeutet, ich habe bereits eine Instanz von SadClass. Ich habe das Gefühl, dass ich alles habe, was ich brauche, um getThings()
zu nennen, aber ich frage mich, ob es eine clevere Möglichkeit gibt, eine Instanz von FunClass zu bekommen, mit der ich getThings()
anrufen könnte?
Ich würde nur eine Instanz von dem, was ich brauche, erklären, aber ich habe Probleme, weil die Klasse und Funktion, die am Ende aufgerufen werden basieren auf Benutzermethode Eingabeargumente (Strings), die ich getattr()
verwendet, um eine Klasse zu bekommen Objekt (FunClass) und ein Methodenobjekt (getThings). Meine Versuche, eine Instanz von FunClass Schaffung hier gelandet:
(3)
>>> ClassObject = getattr(FunClass,"FunClass")
>>> ClassObject
<class 'FunClass.FunClass'>
>>> ClassObject.__new__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object.__new__(): not enough arguments
>>>
Letztendlich möchte ich nur in der Lage sein getThings zu nennen, die ich eine Instanz von FunClass annehmen erfordert. Ich habe auch eine Variable ClassMethod, die ich versuchte, um die Methode aufzurufen. Auch hier meine Klassennamen und Methodennamen kommen in als Strings, und ich wurde mit getattr() Objekte zu erklären, wie folgt aus:
(4)
>>> ClassMethod = getattr(FunClass, "getThings")
>>> ClassMethod
<unbound method FunClass.getThings>
Als ich ClassMethod()
anrufe, bekomme ich den Fehler gesehen in (4). Ich könnte mehr als ein Problem haben, aber Einsicht in jeden Aspekt wäre großartig! Vielen Dank.
EDIT:
(per @nneonneo ‚s Antwort)
ich am Ende tun:
ClassInstance = globals()["FunClass"](self.thing1, self.thing2)
ClassMethod = getattr(ClassInstance, "getThing")
ClassMethod() # to call the function
wo "FunClass" und "getThing" sind eigentlich Saiten in die Funktion übergeben und könnte eine beliebige Anzahl von Klassen/Methoden-Kombinationen sein. Thing1 und Thing2 sind erforderlich, um die Elternklasse (SadClass) irgendwo anders zu instantiieren, so dass ich ihre Unterklasse "FunClass" unter Verwendung dieser vorhandenen Attribute instanziieren und dann eine der Klassenmethoden von FunClass aufrufen kann. SadClass hat das __init__ und FunClass nicht. Problem gelöst.
Die globals() Idee funktioniert! Vielen Dank. Es erlaubt mir, einen dynamischen Klassennamen zu verwenden, der genau das ist, was ich brauchte. – samstav