Ich habe eine Python-Klasse voller statischer Methoden. Was sind die Vor-und Nachteile der Verpackung dieser in einer Klasse und nicht als Rohfunktionen?Gibt es einen Vorteil bei der Verwendung einer Python-Klasse?
Antwort
Es gibt keine. Dies sind Module für: Gruppieren von verwandten Funktionen. Die Verwendung einer Klasse voller statischer Methoden lässt mich vor Javaitis zurückschrecken. Die einzige Zeit, die ich eine statische Funktion verwenden würde, ist, wenn die Funktion ein integraler Bestandteil der Klasse ist. (Tatsächlich würde ich wahrscheinlich sowieso eine Klassenmethode verwenden wollen.)
Ich stimme Benjamin zu. Anstatt eine Reihe von statischen Methoden zu haben, sollten Sie wahrscheinlich eine Reihe von Funktionen haben. Und wenn Sie sie organisieren möchten, sollten Sie darüber nachdenken, Module statt Klassen zu verwenden. Wenn du jedoch deinen Code zu OO umgestalten willst, ist das eine andere Sache.
Nicht nur gibt es keine Vorteile, aber es macht die Dinge langsamer als mit einem Modul voller Methoden. Es gibt viel weniger Bedarf für statische Methoden in Python als für sie in Java oder C#, sie werden in sehr speziellen Fällen verwendet.
Nein. Es wäre besser, sie funktionieren zu lassen und wenn sie zusammenhängen, legen Sie sie in ihr eigenes Modul. wenn Sie eine Klasse wie diese zum Beispiel haben:
class Something(object):
@staticmethod
def foo(x):
return x + 5
@staticmethod
def bar(x, y):
return y + 5 * x
Dann wäre es besser, ein Modul zu haben, wie,
# something.py
def foo(x):
return x + 5
def bar(x, y):
return y + 5 * x
Auf diese Weise verwenden Sie sie auf folgende Weise:
import something
print something.foo(10)
print something.bar(12, 14)
Haben Sie keine Angst vor Namespaces. ;-)
Klassen sind nur nützlich, wenn Sie über eine Funktionalität verfügen, die mit einer Gruppe von Daten interagiert (Instanzeigenschaften), die zwischen Funktionsaufrufen persistent gespeichert und diskret referenziert werden müssen.
Wenn Ihre Klasse nichts anderes als statische Methoden enthält, dann ist Ihre Klasse nur syntaktischer Fehler, und gerade Funktionen sind viel klarer und alles was Sie brauchen.
Wenn Ihre Funktionen aufeinander oder globalen Zustand abhängig sind, sollten Sie auch den dritten Ansatz:
class Something(object):
def foo(self, x):
return x + 5
def bar(self, x, y):
return y + 5 * self.foo(x)
something = Something()
Verwendung dieser Lösung wurde eine Funktion in Isolation testen können, weil Sie das Verhalten einer anderen Funktion außer Kraft setzen kann oder injizieren Abhängigkeiten mit Konstruktor.
Hängt von der Art der Funktionen ab. Wenn sie nicht stark miteinander verwandt sind (minimale Anzahl von Verbindungen zwischen ihnen) und sie keinen Status haben, dann würde ich sagen, dass sie in ein Modul ausgelagert werden. Allerdings könnten Sie sich selbst in den Fuß schießen, wenn Sie das Verhalten ändern müssen, während Sie die Vererbung aus dem Fenster werfen. Also meine Antwort ist vielleicht, und stellen Sie sicher, dass Sie auf Ihr bestimmtes Szenario eher dann immer unter der Annahme, ein Modul ist der beste Weg, um eine Reihe von Methoden zu sammeln.
Ich stimme dem Konsens hier zu, also habe ich mich gefragt: Warum unterstützt Python überhaupt statische Methoden? –
@Darius meist für OO Konsistenz –