Ich frage mich, ob es möglich ist, eine Methode zu erstellen, die sich beim Aufruf als Klassenmethode anders verhält als beim Aufruf als Instanzmethode.
Als Projekt zur Verbesserung der Fähigkeiten schreibe ich zum Beispiel eine Matrix
Klasse (ja, ich weiß, dass es bereits sehr gute Matrixklassen gibt). Ich habe dafür eine Klassenmethode namens identity
die eine Identitätsmatrix einer bestimmten Größe zurückgibt.
Nun, wenn sie auf einer Instanz von Matrix
erscheint es logisch, dass die Größe nicht angegeben werden muss; sie sollte eine Identitätsmatrix der gleichen Größe wie die Matrix
es wird aufgerufen.
Mit anderen Worten, ich möchte eine Methode definieren, die feststellen kann, ob sie über eine Instanz aufgerufen wurde, und, falls ja, auf die Attribute dieser Instanz zugreifen kann. Leider habe ich auch nach Durchforsten der Dokumentation und einigen Google-Suchen nichts gefunden, was darauf hindeutet, dass dies möglich ist. Weiß jemand etwas anderes?
Editer :
Wahnsinn! Offensichtlich bin ich noch nicht ganz an erstklassige Funktionen gewöhnt. So sieht das Ergebnis aus - vielen Dank an Unknown für die Bereitstellung des Schlüssels!
class Foo(object):
def __init__(self, bar):
self.baz = bar
self.bar = MethodType(lambda self: self.__class__.bar(self.baz), self, self.__class__)
@classmethod
def bar(cls, baz):
return 5 * baz
Foo.bar(3) # returns 15
foo = Foo(7)
foo.bar() # returns 35
Bearbeiten 2:
Nur ein kurzer Hinweis - diese Technik (und die meisten der unten vorgestellten) funktioniert nicht bei Klassen, die __slots__
da Sie die Methode nicht neu zuordnen können.