Classe con Object come parametro


114

Sto cercando di tradurre del codice Python in codice scala. Quindi sono un noob totale in Python.

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

Esempio:

class Table(object)

Grazie per il tuo tempo.


1
possibile duplicato delle classi Old style e new style in Python
JBernardo

Risposte:


112

In Python2 questo dichiara Tabledi essere una classe di nuovo stile (al contrario della classe "classica"). In Python3 tutte le classi sono classi di nuovo stile, quindi questo 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, proprietà e super non funzionano con le classi classiche.

In Python2 è una buona idea creare classi di nuovo stile per tutte le classi. (Sebbene molte classi nella libreria standard siano ancora classi classiche, per motivi di compatibilità con le versioni precedenti.)

In generale, in una dichiarazione come

class Foo(Base1, Base2):

Fooviene dichiarato come una classe che eredita dalle classi base Base1e Base2.

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


puoi reindirizzarmi a una fonte che menziona l'oggetto non necessario come parametro in Python3? Non riesco a trovarlo. Grazie
Neve

1
È stato menzionato molte volte su StackOverflow ( qui, ad esempio ), ma non sono stato in grado di trovare una semplice dichiarazione di questo nei documenti. Viene mostrato implicitamente (dall'omissione di objectdall'elenco delle basi di classe) nel tutorial .
unutbu

1
La documentazione di Python3 afferma anche che una "classe nuovo stile" è il "vecchio nome per il sapore delle classi ora usate per tutti gli oggetti classe " (mia enfasi). E la documentazione di Python2 afferma che una "classe di nuovo stile" è qualsiasi classe che eredita da object. Le due istruzioni messe insieme implicano che non è necessario includere objectnell'elenco delle basi di classi in Python3 poiché tutte le classi sono classi di nuovo stile in Python3.
unutbu

21

La Tableclasse sta estendendo una classe chiamata object. Non è un argomento. Il motivo per cui potresti voler estendere objectesplicitamente è che trasforma la classe in una classe di nuovo stile. Se non specifichi esplicitamente che si estende object, fino a Python 3, per impostazione predefinita sarà una classe vecchio stile. (A partire da Python 3, tutte le classi sono di nuovo stile, indipendentemente dal fatto che si estenda esplicitamente objecto meno.)

Per ulteriori informazioni sulle classi nuovo e vecchio stile, vedere questa domanda .


1
Questa è la risposta più semplice e succinta. Grazie.
Sabuncu

3

Solo una nota che la distinzione tra le classi "nuovo stile" e "vecchio stile" è specifica di Python 2.x, in 3.x, tutte le classi sono "nuovo stile".


2

class Table e class Table (oggetto) non sono diverse per Python.

Non è un parametro, si estende dall'oggetto (che è la classe base come molti altri linguaggi).

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


3
L'estensione automatica delle classi objectè un comportamento predefinito solo in Python 3. In python 2, un oggetto che estende la classe ha attributi che una classe che non estende l'oggetto non avrà.
Lewis Ellis,

1

oggetto è il tipo più elementare di oggetto classe definito in python. Gli attributi dell'oggetto possono essere visti come di seguito

** >>> dir (oggetto)

[" class ", " delattr ", " doc ", " format ", " getattribute ", " hash ", " init ", " new ", " reduce ", " reduce_ex ", " repr ", " setattr ", " sizeof ',' str ',' subclasshook '] **

Quindi Table (oggetto) è solo eredità.!


0

1) Nome della classe (oggetto): 2) nome della classe: sono entrambe uguali ma la prima è molto migliore in termini di scrittura, sembra migliore mentre eredita le altre classi da un'altra, sembra omogenea.

Come lo stesso? Quindi, ogni cosa in Python è classificata come oggetto significa che ogni cosa in Python ha la proprietà dell'oggetto, se scrivi o non lo capirà. Nel primo lo diciamo esplicitamente, nel secondo non l'abbiamo fatto.


Questo non è il caso di Python 2, vedi la risposta accettata per i dettagli.
niemmi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.