2013-09-22 6 views
7

Ich versuche herauszufinden, was ich für die integrierte Funktion object() verwenden würde. Es benötigt keine Argumente und gibt ein "merkmalsloses Objekt" des Typs zurück, der allen Python-Klassen gemeinsam ist, und verfügt über alle Methoden, die allen Python-Klassen gemeinsam sind.Wann ist das Objekt() eingebaut nützlich?

zu zitieren Jack Skellington, WHAT. IS. THIS?

+0

Es ist nicht als eine Funktion verwendet werden; es soll eine Basisklasse sein. – refi64

+0

In Python 3? Warum? Was würde ich davon gewinnen? Klassen erben diese Methoden automatisch, nicht? – Aerovistae

+3

Ich finde es urkomisch, wie in der Dokumentation Verknüpfung, die Sie geben, hat es einige Hyperlink-Text, der rekursiv auf sich selbst zeigt. – Shashank

Antwort

11

Auch wenn Sie es nicht brauchen zu programmieren, dient object einen Zweck: es ist die gemeinsame Klasse ist, von dem alle anderen Objekte abgeleitet werden. Es ist die letzte Klasse, die von der mro (method resolution order) Methode aufgelistet wird. Wir brauchen einen Namen und ein Objekt für dieses Konzept, und dient diesem Zweck.

Eine andere Verwendung für object ist sentinels erstellen.

sentinel = object() 

Dies wird oft in multithreaded Programmierung - durch Warteschlangen geführt - zu signal a termination event. Wir möchten möglicherweise nicht None oder einen anderen Wert senden, da der Warteschlangen-Handler diese Werte möglicherweise als zu verarbeitende Argumente interpretieren muss. Wir brauchen einen einzigartigen Wert, den kein anderer Teil des Programms erzeugen kann.

Das Erstellen eines Sentinels auf diese Weise liefert ein solches eindeutiges Objekt, das sicher kein normaler Warteschlangenwert ist und daher als Signal für ein bestimmtes Ereignis getestet und verwendet werden kann. Es gibt andere Möglichkeiten, z. B. das Erstellen einer Klasse oder Klasseninstanz oder einer Funktion, aber alle diese Alternativen sind größer, ressourcenintensiver und nicht so markig wie object().

4

Es ist am nützlichsten, wenn Sie den Punkt überschreiben (insbesondere __setattr__), können Sie die Rekursion zu brechen. Zum Beispiel:

class SomeClass(object): 
    def __setattr__(self, name, value): 
     if name not in ('attr1', 'attr2', 'attr3', 'attr4'): 
      object.__setattr__(self, name, value) 
     else: 
      do_something_else() 
+1

Willkommen bei Stack Exchange! Hier ist Ihr [Karneval Event Guide] (http://stackexchange.com/sites) – Aerovistae

+0

Ich würde im Allgemeinen vermeiden, Methoden auf "Objekt" direkt aufrufen, zugunsten der Verwendung von 'super()' stattdessen. Ein Grund ist, dass es kooperative Mehrfachvererbung ermöglicht. Die 'Objekt'-Klasse wird natürlich immer noch beteiligt sein, da es die letzte Basisklasse ist, die die' super() '-Aufrufe schließlich erreichen, aber Sie müssen sie nicht explizit benennen. – Blckknght

+0

@Blckknght Ich stimme dir generell zu, aber im Falle einer Rekursionsbrechung versuche ich normalerweise auch, die Rekursion zu brechen, die von einer Superklasse verursacht wird (funktioniert nicht mit Frameworks-Spaß?). Dies ist der eine Anwendungsfall, in dem ich (im Allgemeinen) explizit Objekte verwende. – Tritium21