die meisten fragen ja immer, was der Sinn von @staticmethod eigentlich ist, da diese ja weder die Instanz noch die Klasse als Parameter übergeben bekommen.
Ich frage mich nur gerade, wozu man @classmethod braucht, da ich doch alles auch mit @staticmethod realisieren kann.
Als Anwendungsbeispiel für @classmethod werden gerne alternative Konstruktoren (bzw Factorymethoden genannt). Aber diese sind doch auch mit @staticmethod realisierbar.
Zum Beispiel:
Code: Alles auswählen
class Person:
num = 0
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def __repr__(self):
return f'{self.firstname} {self.lastname} (#{self.num})'
@classmethod
def create(cls):
cls.num += 1
return cls('John', 'Doe')
@staticmethod
def create2():
Person.num += 1
return Person('John', 'Doe')
def main():
p = Person.create()
print(p)
p2 = Person.create2()
print(p2)
if __name__ == '__main__':
main()
Haben @classmethod gegenüber @staticmethod irgendwelche Vorteile, oder sind das letztendlich nur Konventionen, damit man sieht, welchen "Scope" diese Methoden haben.
Gerade für Menschen, die aus Sprachen wie Java oder C# kommen, ist dieses Konzept verwirrend, denn eigentlich sind @classmethod ja eher gleichzusetzen mit statischen Methoden in Java und C# als @staticmethod.
Übersehe ich was?
Bringen @classmethod Definitionen irgendwelche Vorteile zu @staticmethod Definitionen?
Vielleicht im Speicherverbrauch oder Geschwindigkeit?
Dazu habe ich leider noch keine genauere Beschreibung gefunden.