2013-09-22 4 views
7

Sto cercando di capire a cosa serve la funzione integrata object() per. Non accetta argomenti e restituisce un "oggetto privo di caratteristiche" del tipo comune a tutte le classi Python e ha tutti i metodi comuni a tutte le classi Python.Quando l'oggetto() built-in è utile?

citare Jack Skellington, WHAT. IS. THIS?

+0

Non deve essere utilizzato come funzione; è destinato ad essere utilizzato come classe base. – refi64

+0

In python 3? Perché? Cosa potrei ottenere da questo? Le classi ereditano automaticamente quei metodi, no? – Aerovistae

+3

Lo trovo esilarante come nel link alla documentazione che si fornisce, ha un testo con collegamenti ipertestuali che ricorsivamente indica se stesso. – Shashank

risposta

11

Anche se non c'è bisogno di programmare con essa, object ha uno scopo: è la classe comune da cui derivano tutti gli altri oggetti. È l'ultima classe elencata dal metodo mro (method resolution order). Abbiamo bisogno di un nome e di un oggetto per questo concetto e object serve a questo scopo.

Un altro utilizzo per object consiste nella creazione di sentinels.

sentinel = object() 

Questo è spesso usato nella programmazione multithread - passato attraverso le code - a signal a termination event. Potremmo non voler inviare None o qualsiasi altro valore poiché il gestore della coda potrebbe dover interpretare quei valori come argomenti da elaborare. Abbiamo bisogno di un valore unico che nessun'altra parte del programma possa generare.

Creare una sentinella in questo modo fornisce solo un oggetto univoco che è sicuro di non essere un normale valore di coda, e quindi può essere testato e utilizzato come segnale per qualche evento speciale. Ci sono altre possibilità, come la creazione di una classe, un'istanza di classe o una funzione, ma tutte queste alternative sono più grandi, più pesanti in termini di risorse e non altrettanto efficaci come object().

4

È molto utile se si esegue l'override del punto (in particolare __setattr__), consente di interrompere la ricorsione. Ad esempio:

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

Benvenuti nello Stack Exchange! Ecco la tua [guida agli eventi di carnevale] (http://stackexchange.com/sites) – Aerovistae

+0

In genere eviterei di chiamare metodi su 'object' direttamente, invece di usare' super() '. Una ragione è che consente l'ereditarietà multipla cooperativa. La classe 'object' sarà comunque coinvolta, poiché è la classe base finale che le chiamate' super() 'alla fine raggiungeranno, ma non è necessario nominarla esplicitamente. – Blckknght

+0

@Blckknght In genere sono d'accordo con te su questo, tuttavia, nel caso di rottura della ricorsione, di solito sto anche cercando di rompere la ricorsione causata da una super classe (non funziona con framework divertenti?). Questo è l'unico caso in cui io (in generale) uso esplicitamente l'oggetto. – Tritium21