Stwierdziłem, że oba poniższe działania:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
Czy wszystkie klasy Pythona powinny rozszerzać obiekt? Czy są jakieś potencjalne problemy z nierozciąganiem obiektu?
python
inheritance
Kara
źródło
źródło
class Foo():
iclass Foo:
? Jak zauważyłem, oba działają w Pythonie 3.Odpowiedzi:
W Pythonie 2 nie dziedziczenie z
object
spowoduje powstanie klasy w starym stylu, co między innymi powodujetype
uzyskanie różnych wyników:vs.
Również zasady wielokrotnego dziedziczenia są różne w sposób, którego nawet nie będę próbował tutaj streszczać. Cała dobra dokumentacja dotycząca MI, którą widziałem, opisuje klasy w nowym stylu.
Wreszcie, w Pythonie 3 zniknęły klasy starego typu, a dziedziczenie z
object
stało się niejawne. Dlatego zawsze preferuj nowe klasy, chyba że potrzebujesz wstecznej kompatybilności ze starym oprogramowaniem.źródło
W Pythonie 3 klasy rozszerzają się
object
niejawnie, niezależnie od tego, czy mówisz to sam, czy nie.W Pythonie 2 istnieją klasy w starym i nowym stylu . Aby zasygnalizować, że klasa jest w nowym stylu, musisz jawnie dziedziczyć z
object
. Jeśli nie, używana jest implementacja w starym stylu.Zwykle chcesz klasy w nowym stylu. Dziedzicz z
object
jawnie. Należy zauważyć, że dotyczy to również kodu Python 3, który ma być zgodny z Pythonem 2.źródło
W Pythonie 3 możesz stworzyć klasę na trzy różne sposoby i wewnętrznie wszystkie są równe (zobacz przykłady). Nie ma znaczenia, w jaki sposób utworzysz klasę, wszystkie klasy w Pythonie 3 dziedziczą po specjalnej klasie zwanej object . Klasa obiektu jest podstawową klasę w Pythonie i zapewnia wiele funkcji, takich jak metody podwójnego podkreślenia deskryptorów, super sposób (metoda), nieruchomości () etc.
Przykład 1.
Przykład 2.
Przykład 3.
źródło
object
że odwołuje się do wbudowanegoobject
. Jeśli musimy wziąć pod uwagę, że jakikolwiek wbudowany identyfikator CPythona może zostać zastąpiony, z trudem moglibyśmy powiedzieć coś o modelu danych. Czy można poważnie argumentować, żestr
nie zawsze akceptuje się ciąg znaków jako argument, ponieważ można go przypisaćbuiltins.str = None
?Tak, wszystkie klasy Pythona powinny rozszerzać (a raczej podklasę, tutaj jest Python). Chociaż zwykle nie wystąpią żadne poważne problemy, w niektórych przypadkach (jak w przypadku wielu drzew dziedziczenia) będzie to ważne. Zapewnia to również lepszą zgodność z Pythonem 3.
źródło
Zgodnie z innymi odpowiedziami, dziedziczenie Pythona 3 po obiekcie jest niejawne. Ale nie mówią, co należy robić i czym jest konwencja.
Wszystkie przykłady dokumentacji Pythona 3 używają następującego stylu, który jest konwencją, więc sugeruję, abyś postępował zgodnie z tym dla każdego przyszłego kodu w Pythonie 3.
Źródło: https://docs.python.org/3/tutorial/classes.html#class-objects
Przykładowy cytat:
Inny cytat:
źródło
w pythonie3 nie ma różnicy, ale w pythonie2 nie rozszerzanie
object
daje klasę w starym stylu; chciałbyś użyć klasy w nowym stylu zamiast klas w starym stylu.źródło