2011-02-05 18 views
8

Se io definire una classe in Python come ad esempio:Ereditarietà predefinita di Python?

class AClass: 
    __slots__ = ['a', 'b', 'c'] 

Quale classe vuol eredita da? Non sembra ereditare da object.

+0

Tutte le risposte riguardanti 'oggetto' e vecchie contro nuove classi sono giuste, ma perché lo chiedi? C'è una ragione pratica o è solo una questione filosofica/di progettazione linguistica? (Perché nella maggior parte dei casi, non importa!) –

+0

Quale versione di Python? Python 2 e Python 3 lo fanno diversamente. –

+0

Penso che stavo cercando di estendere questa classe, ma non mi ha permesso di estenderlo fino a quando non l'ho ereditato da Object. – Verhogen

risposta

11

Se si definisce una classe e non si dichiara alcun genitore specifico, la classe diventa una "classe classica", che si comporta in modo leggermente diverso da "classi di nuovo stile" ereditate dall'oggetto. Vedi qui per maggiori dettagli: http://docs.python.org/release/2.5.2/ref/node33.html

Le classi classiche non hanno una radice comune, quindi in sostanza, la tua AClass non eredita da nessuna classe.

Si noti che questo è specifico per le versioni di Python precedenti alla 3.0. In Python 3, tutte le classi sono classi di nuovo stile ed ereditano implicitamente dall'oggetto, se non viene dichiarato nessun altro genitore.

2

In Python 2.xo precedente, l'esempio AClass è una classe "vecchio stile".

Una classe "new-style" ha un'eredità definita e deve ereditare dall'oggetto o da un'altra classe.

What is the difference between old style and new style classes in Python?

EDIT: Wow, non pensavo fosse possibile utilizzare la sintassi di vecchio stile in Python 3.x. Ma l'ho appena provato e questa sintassi funziona ancora. Ma ottieni una lezione di stile nuovo.

2

Proviamo.

>>> class AClass: 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((), <type 'classobj'>)    # inherits from nothing 

>>> class AClass(object):    # new style inherits from object 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((<type 'object'>,), <type 'type'>) 

Leggere un'introduzione alle nuove classi di stile nei collegamenti forniti in altre risposte.

8

provare il seguente frammento di codice in Python 2.7 e Python 3,1

class AClass: 
    __slots__ = ['a', 'b', 'c'] 
print(type(AClass)) 
print(issubclass(AClass,object)) 
print(isinstance(AClass,type)) 

In Python 2.7, si otterrà:

<type 'classobj'> 
False 
False 

e Python 3.1 si otterrà.

<class type> 
True 
True 

E questo spiega tutto. È una classe di vecchio stile in Python 2, a meno che non la si sottoclassi da object. Solo in Python3, verrà considerato come una nuova classe di stile per impostazione predefinita.

Problemi correlati