2015-02-03 14 views
6

Come è possibile cheA cosa serve object()?

class EmptyClass: 
    def __init__(self): 
     pass 

e = EmptyClass() 
e.a = 123 

opere e:

o = object() 
o.a = 123 

non lo fa (AttributeError: 'object' object has no attribute 'a') mentre

print isinstance(e, object) 
>>> True 

?

Che cos'è il object() valido per quando non è possibile utilizzarlo in questo modo?

+1

Semplicemente perché tutto è un oggetto. Quindi, per qualsiasi cosa esista, deve esistere anche 'object'. – Kroltan

+0

Forse [questa domanda e le sue risposte] (http://stackoverflow.com/questions/4015417/python-class-inherits-object) possono darti un po 'di luce – Barranka

risposta

12

Non è possibile aggiungere attributi a un'istanza di object perché object non ha uno __dict__ attribute (che memorizzerebbe gli attributi). Dal docs:

class object

Ritorna un nuovo oggetto informe. object è una base per tutte le classi. Ha i metodi che sono comuni a tutte le istanze delle classi Python. Questa funzione non accetta argomenti.

Nota: object non hai __dict__, quindi non è possibile assegnare gli attributi arbitrari a un'istanza della classe object.

E object ha i suoi usi:

  1. Come già detto, serve come classe base per tutti gli oggetti in Python. Tutto ciò che vedi e utilizzi in definitiva si basa su object.

  2. È possibile utilizzare object per creare sentinel values che sono perfettamente unici. Provateli con is e is not restituirà solo True quando viene fornita un'istanza esatta object.

  3. In Python 2.x, è possibile (dovrebbe) ereditare da object per creare un new-style class. Le classi di nuovo stile hanno funzionalità migliorate e supporto migliore. Nota che tutte le classi sono automaticamente di nuovo stile in Python 3.x.

+2

Viene anche utile nella generazione di oggetti unici che possiamo usare come sentinella valore (non possiamo usare 'None' ovunque). –

+0

Buona idea, lo aggiungerò. – iCodez

+0

Lo uso occasionalmente per creare un oggetto univoco (con un id unico) che può essere usato come un marcatore speciale o [valore sentinella] (http://en.wikipedia.org/wiki/Sentinel_value) quando si elaborano dati che potrebbe contenere elementi di 'None' o di lunghezza zero che sono valori non sentinella validi. – martineau