Die Python-Funktion object() erzeugt eine minimale Instanz von object — der Wurzel-Klasse aller Python-Klassen. Jede Klasse erbt direkt oder indirekt von object und bekommt damit Default-Methoden wie __init__, __repr__, __eq__, __hash__, __getattribute__. object() selbst hat keine Attribute und wird hauptsächlich als Sentinel-Wert verwendet.

Einleitung

Seit Python 3 ist object die universelle Basis. class Foo: ist äquivalent zu class Foo(object): — alle Klassen sind „new-style". Das bringt jeder Klasse automatisch eine Reihe von Default-Methoden:

  • __init__ (no-op)
  • __repr__<__main__.MyClass object at 0x...>
  • __eq__is-Vergleich
  • __hash__id-basiert
  • __getattribute__, __setattr__, __delattr__
  • __dir__, __sizeof__

object() ohne Argumente liefert eine ganz minimale Instanz. Hauptsächlich nützlich als Sentinel — ein eindeutiger Wert, der nirgends sonst vorkommen kann (anders als None, das gültiger Wert sein kann).

Syntax

Python Syntax
object()

Rückgabewert

Eine neue, leere object-Instanz.

Beispiele

object als Wurzel

Alle Klassen erben von object — die MRO endet immer dort:

Python Beispiel
class A: pass
class B(A): pass

print(object in B.__mro__)
print([cls.__name__ for cls in B.__mro__])
Output
True
['B', 'A', 'object']

Default-Methoden inspizieren

Eine ganz neue Klasse hat schon einen Haufen geerbter Methoden — aus object:

Python Beispiel
class Empty: pass
methods = [m for m in dir(Empty) if not m.startswith("_")]
print(methods)            # leer

dunder = [m for m in dir(Empty) if m.startswith("__")]
print(len(dunder), "dunder methods inherited from object")
Output
[]
25 dunder methods inherited from object

Sentinel-Wert

Ein häufiger Einsatz: ein eindeutiger Marker, der von None unterscheidbar sein muss:

Python Beispiel
MISSING = object()

def get(d, key):
    value = d.get(key, MISSING)
    if value is MISSING:
        return "Schlüssel fehlt komplett"
    if value is None:
        return "Wert ist None (aber Schlüssel existiert)"
    return value

print(get({"a": 1, "b": None}, "a"))
print(get({"a": 1, "b": None}, "b"))
print(get({"a": 1, "b": None}, "c"))
Output
1
Wert ist None (aber Schlüssel existiert)
Schlüssel fehlt komplett

Praktische Beispiele

Default-Argument-Sentinel

Mutable Defaults sind eine Falle — ein object()-Sentinel löst das sauber:

Python Beispiel
_MISSING = object()

def append_item(item, container=_MISSING):
    if container is _MISSING:
        container = []
    container.append(item)
    return container

a = append_item(1)
b = append_item(2)
print(a, b)        # zwei separate Listen — kein Mutable-Default-Bug
Output
[1] [2]

Marker für „keine Argument-Übergabe"

Wenn None ein gültiger Wert ist, hilft object() als „nicht übergeben"-Marker:

Python Beispiel
_UNSET = object()

def update(name=_UNSET, value=_UNSET):
    if name is _UNSET:
        print("name nicht übergeben")
    if value is _UNSET:
        print("value nicht übergeben")
    if name is not _UNSET and value is not _UNSET:
        print(f"{name}={value!r}")

update(name="key", value=None)   # value=None ist explizit
update(name="key")
Output
key=None
value nicht übergeben

Praktische Hinweise

  • object ist die Wurzel — jede Klasse erbt von ihr.
  • Nicht hashable mit Custom __eq__: Wer __eq__ definiert, muss auch __hash__ (oder explizit auf None) setzen.
  • Sentinel-Pattern: object() für eindeutige Marker, die kein User-Wert je gleichen kann.
  • __slots__ einsparen: object-Instanzen haben kein __dict__ — sind sehr schlank.
  • Verwandte Konzepte: type, isinstance(x, object) (immer True), __bases__, __mro__.
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht