Klasa z obiektem jako parametrem

114

Próbuję przetłumaczyć kod Pythona na kod Scala. Więc jestem totalnym noobem w Pythonie.

Ale dlaczego niektóre klasy mają obiekt jako parametr, ale nigdy nie używają go jawnie? Jaki jest powód, dla którego jest to parametr w pierwszej kolejności?

Przykład:

class Table(object)

Dziękuję za Twój czas.

mityczny programista
źródło
1
możliwy duplikat klas starego i nowego stylu w Pythonie
JBernardo

Odpowiedzi:

112

W Pythonie2 deklaruje to, że Tablejest to klasa w nowym stylu (w przeciwieństwie do klasy „klasycznej”). W Pythonie3 wszystkie klasy są klasami w nowym stylu, więc nie jest to już konieczne.

Nowe klasy stylu mają kilka specjalnych atrybutów, których brakuje klasycznym klasom.

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__']

Również właściwości i super nie działają z klasycznymi klasami.

W Pythonie2 dobrym pomysłem jest uczynienie wszystkich klas klasami w nowym stylu. (Chociaż wiele klas w bibliotece standardowej to nadal klasy klasyczne, ze względu na kompatybilność wsteczną).

Ogólnie w stwierdzeniu takim jak

class Foo(Base1, Base2):

Foojest deklarowana jako klasa dziedzicząca po klasach bazowych Base1i Base2.

objectjest matką wszystkich klas w Pythonie. Jest to klasa w nowym stylu, więc dziedziczenie po objecttworzy Tableklasę w nowym stylu.

unutbu
źródło
czy możesz przekierować mnie do źródła, które wspomina, że ​​obiekt nie jest konieczny jako parametr w Python3? Nie mogę tego znaleźć. Dziękuję
Snow
1
Wspomniano o tym wiele razy w StackOverflow ( na przykład tutaj ), ale nie udało mi się znaleźć prostej deklaracji tego w dokumentacji. Jest to pokazane pośrednio (przez pominięcie objectna liście baz klas) w samouczku .
unutbu
1
Dokumentacja Python3 stwierdza również, że „klasa w nowym stylu” jest „starą nazwą stylu klas używanego obecnie dla wszystkich obiektów klas ” (wyróżnienie moje). I stan python2 Docs , że „klasa new-style” jest każda klasa która dziedziczy z object. Te dwie instrukcje razem sugerują, że nie ma potrzeby umieszczania ich objectna liście baz klas w Pythonie3, ponieważ wszystkie klasy są klasami nowego stylu w Python3.
unutbu
21

TableKlasa rozszerza klasę o nazwie object. To nie jest argument. Powodem, dla którego możesz chcieć objectjawnie rozszerzyć, jest zamiana klasy w klasę w nowym stylu. Jeśli nie określisz jawnie extends object, aż do Pythona 3, domyślnie będzie to klasa w starym stylu. (Od Pythona 3 wszystkie klasy są w nowym stylu, niezależnie od tego, czy jawnie rozszerzasz, objectczy nie).

Aby uzyskać więcej informacji na temat klas w nowym i starym stylu, zobacz to pytanie .

icktoofay
źródło
1
To jest bardziej prosta i zwięzła odpowiedź. Dzięki.
Sabuncu,
3

Wystarczy zauważyć, że różnica między klasami „w nowym stylu” a klasami „w starym stylu” jest charakterystyczna dla języka Python 2.x; w wersji 3.x wszystkie klasy są „w nowym stylu”.

Lawrence D'Oliveiro
źródło
2

class Table i class Table (obiekt) nie różnią się od Pythona.

To nie jest parametr, jest rozszerzany z obiektu (który jest klasą bazową, podobnie jak wiele innych języków).

Mówi tylko, że dziedziczy wszystko, co jest zdefiniowane w „obiekcie”. To jest zachowanie domyślne.

Devraj
źródło
3
Automatyczne rozszerzanie klas objectjest zachowaniem domyślnym tylko w Pythonie 3. W Pythonie 2 obiekt rozszerzający klasę ma atrybuty, których nie będzie miała klasa, która nie rozszerza obiektu.
Lewis Ellis,
1

object jest najbardziej podstawowym typem obiektu klasy zdefiniowanym w Pythonie. Atrybuty obiektu można zobaczyć jak poniżej

** >>> reż (obiekt)

[„ klasa ”, „ delattr ”, „ doc ”, „ format ”, „ getattribute ”, „ hash ”, „ init ”, „ nowy ”, „ redukuj ”, „ redukuj_ex ”, „ repr ”, „ setattr ”, „ sizeof ',' str ',' subclasshook '] **

Więc tabela (obiekt) jest po prostu dziedziczeniem.!

Anilkumar Mallakkanavar
źródło
0

1) Nazwa klasy (obiekt): 2) nazwa klasy: Obie są takie same, ale najpierw jedna znacznie lepsza pod względem pisania, lepiej wygląda dziedzicząc inne klasy do innej, wygląda jednorodnie.

Jak to samo? Zatem każda rzecz w Pythonie jest objęta obiektem oznacza, że ​​każda rzecz w Pythonie ma właściwość obiektu, jeśli napiszesz lub nie, zrozumie to. W pierwszej wyraźnie to powiedzieliśmy, w drugiej nie.


źródło
Tak nie jest w Pythonie 2, szczegółowe informacje można znaleźć w zaakceptowanej odpowiedzi.
niemmi