Czy jest jakiś powód, dla którego deklaracja klasy ma dziedziczyć z object
?
Właśnie znalazłem kod, który to robi i nie mogę znaleźć dobrego powodu.
class MyClass(object):
# class code follows...
Czy jest jakiś powód, dla którego deklaracja klasy ma dziedziczyć z object
?
Właśnie znalazłem kod, który to robi i nie mogę znaleźć dobrego powodu.
class MyClass(object):
# class code follows...
Czy jest jakiś powód, dla którego deklaracja klasy ma dziedziczyć z
object
?
W Pythonie 3, poza kompatybilnością między Pythonem 2 i 3, bez powodu. W Pythonie 2 wiele powodów.
W Pythonie 2.x (od 2.2 i nowszych) istnieją dwa style klas w zależności od obecności lub nieobecności object
jako klasy bazowej:
Klasy w stylu „klasycznym”: nie mają klasy object
jako klasy bazowej:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
„nowe” klasy stylu: mają bezpośrednio lub pośrednio (np. dziedziczą z typ wbudowany), object
jako klasa bazowa:
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)
Bez wątpienia, pisząc zajęcia, zawsze będziesz chciał wybrać zajęcia w nowym stylu. Korzyści z tego są liczne, aby wymienić niektóre z nich:
Obsługa deskryptorów. W szczególności możliwe są następujące konstrukcje z deskryptorami:
classmethod
: A method that receives the class as an implicit argument instead of the instance.staticmethod
: metoda, która jako pierwsza nie otrzymuje niejawnego argumentu self
argument.property
: Utwórz funkcje do zarządzania pobieraniem, ustawianiem i usuwaniem atrybut.__slots__
: oszczędza zużycie pamięci przez klasę, a także zapewnia szybszy dostęp do atrybutów . Oczywiście nakłada ograniczenia.Metoda statyczna __new__
: pozwala dostosować sposób, w jaki są nowe wystąpienia klas Utworzony.
Kolejność rozwiązywania metod (MRO): w jakiej kolejności klasy bazowe klasy będą przeszukiwane podczas próby określenia, którą metodę należy wywołać.
Powiązane z MRO, super
wywołania. Zobacz też, super()
uważane za super.
Jeśli nie dziedziczysz po object
, zapomnij o nich. Bardziej wyczerpujący opis poprzednich wypunktowań wraz z innymi zaletami „nowych” klas stylów można znaleźć tutaj.
Jedną z wad klas w nowym stylu jest to, że sama klasa jest bardziej wymagająca pamięci. Jeśli jednak nie tworzysz wielu obiektów klasowych, wątpię, aby stanowiło to problem i jest to negatywne zatonięcie w morzu pozytywów.
W Pythonie 3 rzeczy są uproszczone. Istnieją tylko klasy w nowym stylu (określane po prostu jako klasy), więc jedyną różnicą w dodawaniu object
jest konieczność wpisania 8 dodatkowych znaków. Ten:
class ClassicSpam:
pass
jest całkowicie równoważny (poza nazwą :-) z tym:
class NewSpam(object):
pass
i do tego:
class Spam():
pass
Wszyscy mają object
w swoim __bases__
.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
W Pythonie 2: zawsze dziedzicz wyraźnie po object
. Zdobądź korzyści.
W Pythonie 3: dziedzicz z object
, jeśli piszesz kod, który stara się być niezależny od Pythona, to znaczy, że musi działać zarówno w Pythonie 2, jak i w Pythonie 3. W przeciwnym razie nie rób tego, to naprawdę sprawia, że nie ma różnicy, ponieważ Python wstawia go za kulisami.
object
. Mam wokół Pythona 2.2.3 i po szybkim sprawdzeniu nie mogłem znaleźć przestępcy, ale przeredaguję odpowiedź później, aby była bardziej jasna. Byłbym zainteresowany, gdybyś mógł znaleźć przykład, ale moja ciekawość jest rozbudzona.
- person Dimitris Fasarakis Hilliard; 20.03.2018
object
w swoich podstawach.
- person bruno desthuilliers; 20.03.2018
staticmethod
i classmethod
działają dobrze nawet na zajęciach w starym stylu. property
sorta działa do odczytu na klasach w starym stylu, po prostu nie przechwytuje zapisów (więc jeśli przypiszesz do nazwy, instancja zyskuje atrybut podanej nazwy, który zasłania właściwość). Należy również zauważyć, że ulepszenie __slots__
w zakresie szybkości dostępu do atrybutów polega głównie na cofnięciu straty, jaką ponosi dostęp do atrybutów klas w nowym stylu, więc nie jest to tak naprawdę zaleta klas w nowym stylu (jednak oszczędność pamięci jest zaletą).
- person ShadowRanger; 02.04.2019
Python 3
class MyClass(object):
= Klasa w nowym styluclass MyClass:
= Klasa w nowym stylu (niejawnie dziedziczy z object
)Python 2
class MyClass(object):
= Klasa w nowym styluclass MyClass:
= KLASA STAREGO STYLUWyjaśnienie:
Definiując klasy bazowe w Pythonie 3.x, możesz usunąć object
z definicji. Może to jednak otworzyć drzwi do naprawdę trudnego do wyśledzenia problemu…
Python wprowadził klasy w nowym stylu z powrotem w Pythonie 2.2, a obecnie klasy w starym stylu są naprawdę bardzo stare. Dyskusja o klasach w starym stylu jest pogrzebana w 2 Dokumenty .x i nie istnieją w dokumentacji 3.x.
Problem polega na tym, że składnia klas w starym stylu w Pythonie 2.x jest taka sama jak alternatywna składnia klas w nowym stylu w Pythonie 3.x. Python 2.x jest nadal bardzo powszechnie używany (np. GAE, Web2Py), a każdy kod (lub koder), który nieświadomie wprowadza definicje klas w stylu 3.x do kodu 2.x, będzie miał bardzo przestarzałe obiekty bazowe. A ponieważ zajęcia w starym stylu nie są nikomu na celowniku, prawdopodobnie nie będą wiedzieć, co ich uderzyło.
Więc po prostu przeliteruj to z daleka i oszczędź łzom programistom 2.x.
__metaclass__ = type
na górze modułu (po linii from __future__ import absolute_import, division, print_function
:-) ); jest to hack kompatybilności w Py2, który sprawia, że wszystkie później zdefiniowane klasy w module są domyślnie w nowym stylu, a w Py3 jest to całkowicie ignorowane (po prostu losowa zmienna globalna, która znajduje się wokół), więc jest nieszkodliwa.
- person ShadowRanger; 09.12.2016
Tak, to jest obiekt w „nowym stylu”. Była to funkcja wprowadzona w Pythonie2.2.
Obiekty w nowym stylu mają inny model obiektów niż obiekty klasyczne, a niektóre rzeczy nie będą działać poprawnie z obiektami w starym stylu, na przykład super()
, @property
i deskryptory. Zapoznaj się z tym artykułem, aby uzyskać dobry opis nowości klasa stylu to.
SO link do opisu różnic: Jaka jest różnica między starym stylem i nowe klasy stylów w Pythonie?
object
w Pythonie 2.
- person ; 25.10.2010
Historia z Naucz się Pythona w trudny sposób:
Oryginalna wersja klasy Pythona została zepsuta na wiele poważnych sposobów. Do czasu rozpoznania tej wady było już za późno i musieli ją poprzeć. Aby rozwiązać ten problem, potrzebowali stylu „nowej klasy”, aby „stare klasy” nadal działały, ale możesz użyć nowej, bardziej poprawnej wersji.
Zdecydowali, że użyją słowa „obiekt”, pisanego małymi literami, jako „klasy”, z której dziedziczysz, aby utworzyć klasę. Jest to mylące, ale klasa dziedziczy po klasie o nazwie „object”, aby utworzyć klasę, ale nie jest to obiekt, tak naprawdę jest to klasa, ale nie zapomnij dziedziczyć po obiekcie.
Również po to, aby poinformować Cię, jaka jest różnica między klasami w nowym stylu a klasami w starym stylu, jest to, że klasy w nowym stylu zawsze dziedziczą z klasy object
lub z innej klasy, która dziedziczyła z klasy object
:
class NewStyle(object):
pass
Innym przykładem jest:
class AnotherExampleOfNewStyle(NewStyle):
pass
Podczas gdy klasa bazowa w starym stylu wygląda tak:
class OldStyle():
pass
A klasa potomna w starym stylu wygląda tak:
class OldStyleSubclass(OldStyle):
pass
Widać, że klasa bazowa w starym stylu nie dziedziczy po żadnej innej klasie, jednak klasy w starym stylu mogą oczywiście dziedziczyć po sobie nawzajem. Dziedziczenie z obiektu gwarantuje, że określona funkcjonalność jest dostępna w każdej klasie Pythona. Nowe klasy stylów zostały wprowadzone w Pythonie 2.2
object
nie jest aż tak mylące iw rzeczywistości jest dość standardowe. Smalltalk ma klasę główną o nazwie Object
i metaklasę główną o nazwie Class
. Czemu? Ponieważ tak jak Dog
jest klasą dla psów, Object
jest klasą dla obiektów, a Class
jest klasą dla klas. Java, C#, ObjC, Ruby i większość innych języków OO opartych na klasach, których ludzie używają dzisiaj, a które mają klasę główną, używają jakiejś odmiany Object
jako nazwy, a nie tylko Pythona.
- person abarnert; 04.05.2015
Tak, jest historyczne. Bez tego tworzy klasę w starym stylu.
Jeśli użyjesz type()
na obiekcie w starym stylu, otrzymasz po prostu „instancję”. Na obiekcie w nowym stylu otrzymujesz jego klasę.
type()
na klasie w starym stylu, otrzymasz classobj zamiast type.
- person Joel Sjögren; 15.02.2014
Składnia instrukcji tworzenia klasy:
class <ClassName>(superclass):
#code follows
W przypadku braku innych nadklas, z których konkretnie chcesz dziedziczyć, superclass
powinna zawsze mieć wartość object
, która jest korzeniem wszystkich klas w Pythonie.
object
to technicznie podstawa klas „nowego stylu” w Pythonie. Ale dzisiejsze zajęcia w nowym stylu są tak dobre, jak bycie jedynym stylem zajęć.
Ale jeśli nie użyjesz wyraźnie słowa object
podczas tworzenia klas, to jak wspomnieli inni, Python 3.x niejawnie dziedziczy z nadklasy object
. Ale myślę, że wyraźny jest zawsze lepszy niż ukryty (piekło)