Наследование Python по умолчанию? - PullRequest
9 голосов
/ 05 февраля 2011

Если я определю класс в Python, например:

class AClass:
   __slots__ = ['a', 'b', 'c']

От какого класса он наследуется?Кажется, он не наследуется от object.

Ответы [ 4 ]

12 голосов
/ 05 февраля 2011

Если вы определяете класс и не объявляете какого-либо конкретного родителя, класс становится «классическим классом», который ведет себя немного иначе, чем «классы нового стиля», унаследованные от объекта. Подробнее смотрите здесь: http://docs.python.org/release/2.5.2/ref/node33.html

Классические классы не имеют общего корня, поэтому по сути ваш AClass не наследуется ни от одного класса.

Обратите внимание, что это относится к версиям Python до 3.0. В Python 3 все классы являются классами нового стиля и неявно наследуются от объекта, если никакой другой родительский объект не объявлен.

8 голосов
/ 05 февраля 2011

Попробуйте следующий фрагмент кода в Python 2.7 и Python 3.1

class AClass:
   __slots__ = ['a', 'b', 'c']
print(type(AClass))
print(issubclass(AClass,object))
print(isinstance(AClass,type))

В Python 2.7 вы получите:

<type 'classobj'>
False
False

И Python 3.1 вы получите.

<class type>
True
True

И это все объясняет.Это класс старого стиля в Python 2, если вы не подкласс его из object.Только в Python3 он будет обрабатываться как новый класс стилей по умолчанию.

2 голосов
/ 05 февраля 2011

Давайте попробуем.

>>> 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'> )

Прочитайте введение в новые классы стилей в ссылках, приведенных в других ответах.

2 голосов
/ 05 февраля 2011

В Python 2.x или старше ваш пример AClass является классом "старого стиля".

Класс "нового стиля" имеет определенное наследование и должен наследоваться от объекта или другого объекта.class.

В чем разница между старым и новым стилем классов в Python?

РЕДАКТИРОВАТЬ: Wow я не думал, что можно было использовать старыйв стиле Python 3.x.Но я только что попробовал, и этот синтаксис все еще работает.Но вы получаете новый класс стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...