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:

DecoratorErstes ArgumentAufruf-Form
(kein)selfnur über Instanz
@classmethodclsKlasse 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

Python 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:

Python Beispiel
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 Instanz
Output
7
11

Validator als staticmethod

Eine Validierung, die zur Klasse gehört, aber nicht auf Instance-Daten angewiesen ist — perfekt als @staticmethod:

Python Beispiel
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)
Output
info@mibeon.com
Ungültige E-Mail: no-email

staticmethod vs. classmethod

Der Unterschied wird beim Subklassen-Aufruf klar — classmethod bekommt die richtige Subklasse, staticmethod ignoriert sie:

Python Beispiel
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-Information
Output
Sound from Dog
Sound from somewhere

Praktische 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:

Python Beispiel
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"))
Output
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:

Python Beispiel
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)
Output
[2, 3, 5, 7, 11, 13, 17, 19]

Praktische Hinweise

  • Kein self, kein cls — 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: staticmethod ignoriert Subklassen — wer das nicht möchte, nutzt classmethod.
  • Aufruf gleich von Klasse und Instanz — beide funktionieren.
  • Verwandte Decorators: @classmethod, @property, @functools.singledispatch.
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht