Die Python-Funktion staticmethod() markiert eine Methode als statische Methode — sie bekommt weder self noch cls als impliziten ersten Parameter. Damit ist sie funktional eine ganz normale Funktion, die nur innerhalb einer Klasse für die logische Gruppierung lebt. Im Alltag wird staticmethod als Decorator @staticmethod verwendet.
Einleitung
Statische Methoden gehören thematisch zu einer Klasse, brauchen aber weder die Instanz noch die Klasse selbst. Typische Anwendungsfälle:
- Hilfsfunktionen, die zu einer Klasse passen, aber unabhängig von Instanz/Klasse arbeiten.
- Validatoren und Parser, die nur die Eingabe prüfen.
- Konstanten-Berechnungen.
Drei Methoden-Arten im Vergleich:
| Decorator | Erstes Argument | Aufruf-Form |
|---|---|---|
| (kein) | self | nur über Instanz |
@classmethod | cls | Klasse oder Instanz |
@staticmethod | (keins) | Klasse oder Instanz |
Wer eine staticmethod aus dem Klassen-Kontext entfernen kann, ohne dass es Sinn verliert — der sollte sie als Modul-Funktion auslagern. staticmethod ist nur sinnvoll, wenn die Zugehörigkeit zur Klasse semantisch wichtig ist.
Syntax
class MyClass:
@staticmethod
def my_method(arg1, arg2, ...):
...Rückgabewert
Eine staticmethod-Wrapper-Instanz, die beim Attribut-Zugriff die ursprüngliche Funktion ohne Bindung liefert.
Beispiele
Standard-Verwendung
@staticmethod markiert die Methode — der Aufruf funktioniert auf der Klasse oder einer Instanz:
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(3, 4)) # auf Klasse
m = Math()
print(m.add(5, 6)) # auf Instanz7
11Validator als staticmethod
Eine Validierung, die zur Klasse gehört, aber nicht auf Instance-Daten angewiesen ist — perfekt als @staticmethod:
import re
class User:
EMAIL_RE = re.compile(r"^[\w.+-]+@[\w-]+\.[\w.-]+$")
def __init__(self, name, email):
if not self.is_valid_email(email):
raise ValueError(f"Ungültige E-Mail: {email}")
self.name = name
self.email = email
@staticmethod
def is_valid_email(value):
return bool(User.EMAIL_RE.match(value))
u = User("Michael", "info@mibeon.com")
print(u.email)
try:
User("X", "no-email")
except ValueError as e:
print(e)info@mibeon.com
Ungültige E-Mail: no-emailstaticmethod vs. classmethod
Der Unterschied wird beim Subklassen-Aufruf klar — classmethod bekommt die richtige Subklasse, staticmethod ignoriert sie:
class Animal:
@classmethod
def make_sound_class(cls):
return f"Sound from {cls.__name__}"
@staticmethod
def make_sound_static():
return "Sound from somewhere"
class Dog(Animal): pass
print(Dog.make_sound_class()) # Subklasse erkannt
print(Dog.make_sound_static()) # keine Klassen-InformationSound from Dog
Sound from somewherePraktische Beispiele
Sammlung von Hilfsfunktionen in einer Klasse
Wenn eine Gruppe von Hilfsfunktionen logisch zur Klasse gehört, kann eine "Utility"-Klasse mit @staticmethod-Sammlung sinnvoll sein:
class StringUtils:
@staticmethod
def normalize(s):
return s.strip().lower()
@staticmethod
def slugify(s):
return StringUtils.normalize(s).replace(" ", "-")
@staticmethod
def truncate(s, max_len=20, suffix="…"):
return s if len(s) <= max_len else s[: max_len - len(suffix)] + suffix
print(StringUtils.normalize(" HELLO World "))
print(StringUtils.slugify("Mein Erster Artikel"))
print(StringUtils.truncate("Ein etwas zu langer Titel"))hello world
mein-erster-artikel
Ein etwas zu langer…Faktorisierungs-Hilfe in einer Math-Klasse
Eine reine Helper-Funktion, die zur Klasse gehört, aber keine Instanz-Daten braucht — das ist exakt der staticmethod-Use-Case:
class NumberMath:
@staticmethod
def is_prime(n):
if n < 2:
return False
if n < 4:
return True
if n % 2 == 0:
return False
for i in range(3, int(n**0.5) + 1, 2):
if n % i == 0:
return False
return True
primes = [n for n in range(20) if NumberMath.is_prime(n)]
print(primes)[2, 3, 5, 7, 11, 13, 17, 19]Praktische Hinweise
- Kein
self, keincls— sonst wäre es eine Instanz- oder Klassen-Methode. - Wenn keine Klassen-Bindung nötig ist — vielleicht ist eine Modul-Funktion die bessere Wahl.
- Vererbung:
staticmethodignoriert Subklassen — wer das nicht möchte, nutztclassmethod. - Aufruf gleich von Klasse und Instanz — beide funktionieren.
- Verwandte Decorators:
@classmethod,@property,@functools.singledispatch.