Ich habe eine Klasse Foo mit einer Methode isValid. Dann habe ich eine Methode bar(), die ein Foo-Objekt empfängt und dessen Verhalten davon abhängt, ob es gültig ist oder nicht.Was ist der allgemeinste Python-Typ, dem ich Attribute hinzufügen kann?
Um dies zu testen, wollte ich einige Objekte an Bar übergeben, deren IsValid-Methode immer False zurückgibt. Aus anderen Gründen kann ich zum Zeitpunkt des Tests kein Objekt von Foo erstellen, also brauchte ich ein Objekt, um es zu fälschen. Ich dachte zuerst daran, das allgemeinste Objekt zu erstellen und das Attribut isValid hinzuzufügen, um es als Foo zu verwenden. Aber das hat nicht ganz funktioniert:
>>> foo = object()
>>> foo.isValid = lambda : False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'isValid'
fand ich heraus Objekt keine __dict__
, so kann man nicht Attribute hinzufügen. An diesem Punkt wird die Abhilfe, die ich verwende, die Schaffung eine Art on the fly zu diesem Zweck und dann ein Objekt dieser Art zu schaffen:
>>> tmptype = type('tmptype',(), {'isValid' : lambda self : False})
>>> x = tmptype()
>>> x.isValid()
False
Aber das scheint zu lange einen Schuss. Es muss einen leicht verfügbaren allgemeinen Typ geben, den ich für diesen Zweck verwenden könnte, aber welcher?
Nun, das ist im Grunde das Gleiche, das sich auf mehr Zeilen und mit einer neuen Stilklasse verteilt. Aber meine Frage besteht immer noch: Gibt es nicht einen allgemein verfügbaren Typ, um den gleichen Zweck zu erreichen? Etwas wie ein Objekt mit einem __dict__? Muss ich wirklich einen Typ nur dafür erstellen? – ricab
@ricab: Hier ist eine Ablehnung der Idee, die ich gerade von Google gezogen habe. Sie können möglicherweise andere finden. http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html – aaronasterling
Oh, ok, also gibt es keinen solchen Typ. Ich habe es wahrscheinlich nur vermisst ... Danke – ricab