2011-02-05 23 views
8

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.

+0

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!) –

+0

Jaką wersję Python? Python 2 i Python 3 robią to inaczej. –

+0

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

Odpowiedz

11

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.

2

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.

2

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.

8

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.

Powiązane problemy