Gdybym zdefiniować klasę w Pythonie takich jak:Python Default Inheritance?
class AClass:
__slots__ = ['a', 'b', 'c']
Która klasa to dziedziczyć? Wygląda na to, że nie dziedziczy po object
.
Gdybym zdefiniować klasę w Pythonie takich jak:Python Default Inheritance?
class AClass:
__slots__ = ['a', 'b', 'c']
Która klasa to dziedziczyć? Wygląda na to, że nie dziedziczy po object
.
Jeśli zdefiniujesz klasę i nie zadeklarujesz żadnego konkretnego rodzica, klasa stanie się "klasą klasyczną", która zachowuje się nieco inaczej niż "klasy nowego stylu" odziedziczone po obiekcie. Zobacz tutaj, aby uzyskać więcej informacji: http://docs.python.org/release/2.5.2/ref/node33.html
Klasy klasyczne nie mają wspólnego katalogu głównego, więc zasadniczo AClass nie dziedziczy z żadnej klasy.
Należy zauważyć, że jest to specyficzne dla wersji Pythona przed 3.0. W Pythonie 3 wszystkie klasy są klasami nowego stylu i dziedziczą pośrednio z obiektu, jeśli nie zadeklarowano żadnego innego rodzica.
W języku Python 2.x lub starszym przykład AClass
jest klasą "starego stylu".
Klasa "nowego stylu" ma zdefiniowane dziedziczenie i musi dziedziczyć z obiektu lub innej klasy.
What is the difference between old style and new style classes in Python?
EDIT: Wow, nie sądziłem, że można było użyć składni w starym stylu w Pythonie 3.x. Ale po prostu spróbowałem i ta składnia nadal działa. Ale dostajesz klasę w nowym stylu.
Spróbujmy.
>>> class AClass:
... pass
...
>>> AClass.__bases__, type(AClass)
((), <type 'classobj'>) # inherits from nothing
>>> class AClass(object): # new style inherits from object
... pass
...
>>> AClass.__bases__, type(AClass)
((<type 'object'>,), <type 'type'>)
Przeczytaj wprowadzenie do nowych klas stylu w linkach podanych w innych odpowiedziach.
Spróbuj następujący fragment kodu w Pythonie 2.7 i Python 3.1
class AClass:
__slots__ = ['a', 'b', 'c']
print(type(AClass))
print(issubclass(AClass,object))
print(isinstance(AClass,type))
W Pythonie 2.7, dostaniesz:
<type 'classobj'>
False
False
i Python 3.1 dostaniesz.
<class type>
True
True
I to wszystko wyjaśnia. Jest to klasa starego stylu w Pythonie 2, chyba że podklasujesz ją pod object
. Tylko w Python3 będzie on domyślnie traktowany jak nowa klasa stylów.
Wszystkie odpowiedzi dotyczące "obiektu" i klas starych i nowych są prawidłowe, ale dlaczego pytasz? Czy istnieje praktyczny powód, czy jest to tylko pytanie filozoficzno-językowe? (Ponieważ w większości przypadków to nie ma znaczenia!) –
Jaką wersję Python? Python 2 i Python 3 robią to inaczej. –
Myślę, że próbowałem rozszerzyć tę klasę, ale nie pozwoliłbym jej przedłużyć, dopóki nie uczynię jej dziedziczenia z Object. – Verhogen