2016-01-08 1 views
3

Я попробовал это в РЕПЛ Пайтона:В чем разница между `type()` `__class__` и` __bases__` в Python?

>>> class Foo: 
... def f():{} 
... 
>>> 
>>> type(Foo) 
<type 'classobj'> 
>>> Foo.__bases__ 
() 
>>> type(type(Foo)) 
<type 'type'> 
>>> type(Foo).__bases__ 
(<type 'object'>,) 

Однако я до сих пор не могу понять, что «тип данных» означает, что в ООП точно.

В Python я знаю, что экземпляр может получить свой класс .__class__, а класс может получить свой родительский класс на .__bases__. Это кажется легким для понимания.

Но что же такое type «Класс», или TypeObject? И что означает type из Type Object? Что означает __bases__ of Type Object? В чем разница между type и class в Python?

Это выглядит немного запутанным для меня .. У кого-нибудь есть идеи об этом?

+1

Ваш код помечен 'питон-3.x', но это выглядит как' питона-2. x' - 'type (Foo)' возвращает '' в python 3+. – Holt

+0

Это напрямую не связано с этим вопросом, но полезно знать http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python –

ответ

2

Ключом к пониманию является распознавание того, что все в python является объектом. Кроме того, технически object не является ключевым словом, это глобальный встроенный.

This answer is perhaps the best explanation I've ever seen on the topic. Я настоятельно рекомендую прочитать весь пост. Он много говорит о метаклассах, а type очень привязан к метаклассам.

По существу, тип класса - это MetaClass. И так же, как все классы нового стиля в python наследуют от object, все метаклассы наследуют от type. Это немного запутанно, потому что глобальный в python type используется для двух разных целей. Это метакласс и функция, которая возвращает тип объекта.

Очень простой способ подумать, что метаклассы создают классы так же, как классы создают экземпляры.

0

В классах питона являются объектами, то есть классы «нечто, что как и все остальное» В вашем примере,

class Foo(): 
    pass 

x = Foo() 

type(x)      # Foo, x is a Foo 
type(Foo)     # type, Foo is a type 

Foo т.е. класс, который определяется не только кусок кода. Это объект, который занимает пространство в памяти.

Foo == 1     # Valid comparisson which evaluates to False 
Bar = Foo     # Assign new variable bar as Foo 

Действительные операции.

>>> type(type(Foo)) 
<type 'type'> 

тип представляет собой особый вид класса (metaclass) и это объекты классов, которые могут создавать объекты

Смежные вопросы