2011-09-11 16 views
63

Sto provando a tradurre qualche codice python in scala codice. Quindi sono un noob totale in Python.Classe con oggetto come parametro

Ma perché alcune classi hanno come parametro un oggetto ma non lo usano mai esplicitamente? Qual è il motivo per averlo come parametro in primo luogo?

Esempio:

class Table(object) 

Grazie per il vostro tempo.

+0

possibile duplicato di [Classi vecchio stile e nuovo stile in Python] (http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python) – JBernardo

risposta

68

In Python2 questo dichiara Table essere un new-style class (in contrasto con la classe "classico"). In Python3 tutte le classi sono classi di nuovo stile, quindi non è più necessario.

Le nuove classi di stile hanno alcuni attributi speciali che mancano alle classi classiche.

class Classic: pass 
class NewStyle(object): pass 

print(dir(Classic)) 
# ['__doc__', '__module__'] 

print(dir(NewStyle)) 
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Inoltre, properties e super non funzionano con le classi classiche.

In Python2 è una buona idea rendere tutte le classi classi di nuovo stile. (Anche se un sacco di classi nella libreria standard sono ancora corsi classici, per il bene di backward-compatibilità.)

In generale, in una dichiarazione come

class Foo(Base1, Base2): 

Foo è essere dichiarata come una classe ereditato dalle classi di base Base1 e Base2.

object è la madre di tutte le classi in Python. È una classe di nuovo stile, quindi ereditare da object rende una classe di nuovo stile Table.

+0

puoi reindirmi a una fonte che cita che l'oggetto non è necessario come parametro in Python3? Non riesco a trovarlo. Grazie –

+1

È stato menzionato più volte su StackOverflow ([qui, per esempio] (https://stackoverflow.com/a/16193572/190597)), ma non sono stato in grado di trovare una semplice dichiarazione di questo nel Documenti. È mostrato implicitamente (dall'omissione di 'object' dall'elenco delle basi di classe) [nel tutorial] (https://docs.python.org/3/tutorial/classes.html#class-definition-syntax). – unutbu

+1

I [Python3 docs] (https://docs.python.org/3/glossary.html#term-new-style-class) affermano inoltre che una "nuova classe di stile" è il "vecchio nome per il sapore di classi ** ora usate per tutti gli oggetti di classe ** "(la mia enfasi). E [lo stato dei documenti Python2] (https://docs.python.org/2/glossary.html#term-new-style-class) che una "classe di nuovo stile" è una qualsiasi classe che eredita da 'object'. Le due affermazioni raccolte implicano che non è necessario includere 'object' nell'elenco delle basi di classe in Python3 poiché tutte le classi sono classi new-style in Python3. – unutbu

14

La classe Table sta estendendo una classe denominata object. Non è una discussione. Il motivo per cui potresti voler estendere in modo esplicito object è trasformare la classe in una classe di nuovo stile. Se non lo specifichi esplicitamente, estende object, fino a Python 3, per impostazione predefinita si tratta di una classe vecchio stile. (Dal momento che Python 3, tutte le classi sono di nuovo stile, se si estende in modo esplicito object o no.)

Per ulteriori informazioni sulle classi in stile nuovo e vecchio stile, si prega di see this question.

+1

Questo è il più risposta semplice e concisa. Grazie. – Sabuncu

2

classe Tabella e classe Tabella (oggetto) non sono diversi per Python.

Non è un parametro, si estende dall'oggetto (che è una classe base come molte altre lingue).

Tutto ciò che dice è che eredita tutto ciò che è definito in "oggetto". Questo è il comportamento predefinito.

+3

Le classi che estendono automaticamente 'object' è il comportamento predefinito solo in Python 3. In python 2, un oggetto extender di classe ha attributi che una classe che non estende l'oggetto non avrà. –

1

Solo una nota che il “nuovo stile" vs distinzione di classe ‘vecchio stile’ è specifico per Python 2.x, in 3.x, tutte le classi sono ‘new-style’

0

1). Nome classe (oggetto): 2) nome classe: Entrambi sono uguali ma il primo è piuttosto migliore in termini di scrittura, ha un aspetto migliore mentre eredita altre classi a un altro, sembra omogeneo.

Come lo stesso? Quindi, ogni cosa in Python è sotto l'oggetto significa che ogni cosa in Python ha la proprietà dell'oggetto, se scrive o non lo capirà. In primo luogo, lo diciamo esplicitamente in secondo luogo.

+0

Questo non è il caso in Python 2, vedere risposta accettata per i dettagli. – niemmi

0

oggetto è il tipo più base di oggetto classe definito in python. attributi dell'oggetto possono essere visti come sotto

** >>> dir (oggetto)

[ 'classe', 'delattr', 'doc', 'formato' , 'getattribute', 'hash', 'init', 'nuova', 'ridurre ', 'reduce_ex ' 'repr', 'setattr', 'sizeof', 'str',' subclasshook '] **

Così Table (oggetto) è solo l'ereditarietà. !

Problemi correlati