Wszystkie wbudowane w Python podklasy to object
i napotykam wiele klas zdefiniowanych przez użytkownika, które również są. Czemu? Jaki jest cel klasy object
? To tylko pusta klasa, prawda?Jaki jest cel podklasy klasy "obiekt" w Pythonie?
Odpowiedz
Krótko mówiąc, ustawia ona wolne magiczne kucyki.
W długiej wersji, Python 2.2 i wcześniejsze używały "klas starego stylu". Były szczególną implementacją klas i miały kilka ograniczeń (na przykład nie można było zbudować klasy podklasy). Rozwiązaniem tego było stworzenie nowego stylu klasy. Ale zrobienie tego wiązałoby się z pewnymi zmianami niekompatybilnymi wstecz. Tak więc, aby upewnić się, że kod napisany dla klas w starym stylu będzie nadal działał, klasa object
została stworzona, aby działać jako nadklasa dla wszystkich klas w nowym stylu. W Pythonie 2.X, class Foo: pass
utworzysz klasę starego stylu, a class Foo(object): pass
utworzy nową klasę stylu.
Więcej informacji na ten temat można znaleźć w artykule Guido: Unifying types and classes in Python 2.2.
Ogólnie rzecz biorąc, dobrze jest wpaść w nawyk dokonywania wszystkich zajęć w nowym stylu, ponieważ niektóre rzeczy (dekorator @property
jest tym, który przychodzi do głowy) nie będą działać z klasami starego stylu .
Dobrze, ale oznacza to klasę jako klasa new-style. Nowo opracowane klasy powinny korzystać z bazy object
, ponieważ kosztują one mało i na przyszłość kodu.
Ma to związek z "nowym stylem" zajęć. Możesz przeczytać więcej na ten temat tutaj: http://docs.python.org/tutorial/classes.html#multiple-inheritance i również tutaj: http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
Korzystanie z klas nowego stylu pozwoli Ci używać „nowsze, wszechstronne funkcje Pythona jak __slots__, opisów, właściwości i __getattribute __().”
Krótka wersja jest taka, że klasyczne klasy, które nie potrzebowały superklasy, miały ograniczenia, których nie można było obejść bez zerwania wielu starych kodów. Stworzyli więc koncepcję klas w nowym stylu, które mają podklasę od object
, a teraz możesz robić fajne rzeczy, takie jak definiowanie właściwości, a podklasy dict
nie są już ćwiczeniem bólu i dziwnych błędów.
Szczegóły znajdują się w punkcie 3.3 docs Pythona: New-style and classic classes.
Python 2.2 introduced "new style classes" który miał kilka dodatkowych funkcji w stosunku do dawnych klas styl, który nie podklasa obiektu. Obiekt Subclasses był wybranym sposobem wskazania, że klasa powinna być klasą nowego stylu, a nie klasą starszą.
Krótka odpowiedź: instacji object
skutecznie sprawia, że nowy styl klasa (zauważ, że jest to konieczne, ponieważ automatyczne w Pythonie 3.x)
Dla różnicy pomiędzy new style
klas i old style
klas: patrz this stackoverflow question. Pełna historia: patrz this nice writeup on Python Types and Objects.
@thetaiko wymienia kilka innych rzeczy w nowym stylu, o których warto wiedzieć. –
Dla potomności warto wspomnieć, że klasy w nowym stylu są domyślne w Pythonie3, a podklasowanie 'obiektu' jest niepotrzebne. – slightlynybbled