Klasa Pythona dziedziczy obiekt
Czy Jest jakiś powód, dla którego deklaracja klasy dziedziczy po object
?
Właśnie znalazłem jakiś kod, który to robi i nie mogę znaleźć dobrego powodu.
class MyClass(object):
# class code follows...
7 answers
Czy Jest jakiś powód, dla którego deklaracja klasy dziedziczy po
object
?
TL;dr: w Pythonie 3, oprócz zgodności pomiędzy Pythonem 2 i 3, nie ma powodu. W Pythonie 2, wiele powodów .
Python 2.historia x:
W Pythonie 2.x (począwszy od 2.2) istnieją dwa style klas w zależności od obecności lub braku object
jako klasy bazowej:
-
"klasyczna" style klasy: nie mają
object
jako klasa bazowa:>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
-
"nowe klasy" style: mają, bezpośrednio lub pośrednio (np. dziedziczą z wbudowanego typu),
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 będziesz zawsze chcesz iść na zajęcia w Nowym Stylu. Korzyści z tego są liczne, aby wymienić niektóre z nich:
-
Wsparcie dla deskryptorów . W szczególności następujące konstrukcje są możliwe dzięki deskryptorom:
-
classmethod
: metoda, która odbiera klasę jako argument niejawny zamiast instancji. -
staticmethod
: metoda, która nie otrzymuje argumentu implicitself
jako pierwszego argumentu. - właściwości z
property
: tworzenie funkcji do zarządzania uzyskiwaniem, ustawianiem i usuwaniem atrybutów. -
__slots__
: oszczędza zużycie pamięci klasy, a także powoduje szybsze dostęp do atrybutów. Oczywiście, to nie narzuca ograniczenia .
-
Na
__new__
metoda statyczna: pozwala dostosować sposób tworzenia nowych instancji klas.Method resolution order (MRO) : w jakiej kolejności klasy bazowe klasy będą wyszukiwane podczas próby rozwiązania, którą metodę wywołać.
Związane z MRO,
super
połączenia . Zobacz też,super()
rozważane super.
Jeśli nie odziedziczysz po object
, zapomnij o tym. Bardziej wyczerpujący opis poprzednich punktów punktowych wraz z innymi atutami "nowych" klas stylów można znaleźć tutaj .
Python 3.x story:
W Pythonie 3 rzeczy są uproszczone. Istnieją tylko klasy nowego stylu (nazywane po prostu klasami), więc jedyną różnicą w dodaniu object
jest wymóg wpisania 8 znaków więcej. To:
class ClassicSpam:
pass
Jest całkowicie równoznaczne (poza nazwą : -) z tym:
class NewSpam(object):
pass
I do tego:
class Spam():
pass
Wszystkie mają object
w swoich __bases__
.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
Więc, co powinieneś zrobić?
W Pythonie 2: zawsze dziedziczyć od object
jawnie . Zdobądź korzyści.
W Pythonie 3: inherit from object
Jeśli piszesz kod, który próbuje być agnostyczny w Pythonie, to znaczy, że musi działać zarówno w Pythonie 2, jak i w Pythonie 3. W przeciwnym razie nie, to naprawdę nie ma znaczenia, ponieważ Python wstawia go za kulisami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 12:24:33
Python 3.x:class MyClass(object):
= klasa w Nowym Styluclass MyClass:
= klasa new-style (domyślnie dziedziczy z obiektu)
Python 2.x:class MyClass(object):
= klasa w Nowym Styluclass MyClass:
= klasa w starym stylu
Wyjaśnienie:
Podczas definiowania klas bazowych w Pythonie 3.x, możesz usunąć obiekt z definicji. Jednak może to otworzyć drzwi dla poważnie trudnego do wyśledzenia problemu ... ]}
Python wprowadził klasy nowego stylu w Pythonie 2.2, a przez teraz zajęcia w starym stylu są naprawdę dość stare. Dyskusja klas starego stylu jest Zakopane w 2.x docs , a nieistniejące w 3.x docs.
Problem polega na tym, składnia klas starego stylu w Pythonie 2.x jest taka sama jak składnia alternatywna dla klas nowego stylu w Pythonie 3.x . Python 2.x jest nadal bardzo szeroko stosowany (np. GAE, Web2Py), a każdy kod (lub koder) nieświadomie wprowadzający 3.X-style klasy definicje na 2.x code skończy się na czymś poważnym przestarzałe obiekty bazowe. A ponieważ klasy w starym stylu nie są na niczyim radarze, prawdopodobnie nie będą wiedzieć, co ich uderzyło.
Więc po prostu przeliteruj to na dłuższą drogę i zapisz jakieś 2.X developer the tears.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 19:24:35
Tak, jest to obiekt "nowego stylu". Była to funkcja wprowadzona w python2. 2.
Obiekty nowego stylu mają inny model obiektowy niż obiekty Klasyczne, a niektóre rzeczy nie będą działać poprawnie z obiektami starego stylu, na przykład, super()
, @property
i deskryptory. Zobacz Ten artykuł , aby dowiedzieć się, czym jest nowa klasa stylu.
Więc link do opisu różnic: Jaka jest różnica między klasami Starego i nowego stylu w Pythonie?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 18:54:12
Historia z Naucz się Pythona trudnym sposobem :
Oryginalna wersja Pythona klasy została złamana w wielu poważnych sposoby. Zanim usterka została rozpoznana, było już za późno., i musieli to poprzeć. Aby rozwiązać problem, potrzebowali jakiś styl "nowej klasy", żeby "stare klasy" działały dalej ale możesz użyć nowej, bardziej poprawnej wersji.
Zdecydowali, że użyją słowa" obiekt", z małej litery, aby być na "klasa", z której dziedziczysz, aby stworzyć klasę. To jest mylące., ale klasa dziedziczy z klasy o nazwie "object", aby utworzyć klasę, ale to nie jest obiekt naprawdę jego klasa, ale nie zapomnij dziedziczyć z obiektu.
Również po to, abyś wiedział, 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 odziedziczyła z klasy object
:
class NewStyle(object):
pass
Inny przykład jest:
class AnotherExampleOfNewStyle(NewStyle):
pass
Podczas gdy klasy bazowe w starym stylu wyglądają tak:
class OldStyle():
pass
A Klasa dziecięca w starym stylu wygląda tak:
class OldStyleSubclass(OldStyle):
pass
Widać, że klasy bazowe starego stylu nie dziedziczą po żadnej innej klasie, jednak klasy starego stylu mogą oczywiście dziedziczyć po sobie. Dziedziczenie z obiektu gwarantuje, że pewna funkcjonalność jest dostępna w każdej klasie Pythona. W Pythonie 2.2 wprowadzono nowe klasy stylów
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-17 08:59:43
Tak, to historyczne . Bez niego 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ę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 14:06:28
Składnia instrukcji tworzenia klasy:
class <ClassName>(superclass):
#code follows
W przypadku braku innych superklas, z których konkretnie chcesz dziedziczyć, superclass
powinny być zawsze object
, który jest korzeniem wszystkich klas w Pythonie.
object
technicznie jest korzeniem klas" nowego stylu " w Pythonie. Ale zajęcia w Nowym Stylu są dziś tak dobre, jak jest jedynym stylem zajęć.
Ale jeśli nie używasz jawnie słowa object
podczas tworzenia klas, to jako inne, Python 3.x domyślnie dziedziczy z superklasy object
. Ale myślę, że explicit jest zawsze lepszy niż implicit (piekło)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-20 05:37:38
To tworzy klasę nowego stylu .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 14:20:09