Python 2 не имеет единой иерархии объектов (т. Е. Не все происходит от класса объектов). Все, что является частью этой иерархии, может быть воспроизведено через __class__
, но то, что не может быть изменено таким образом (или вообще, на самом деле). Они называются «типами» Python, и они жестко запрограммированы в C. Примеры типов: str
, int
, float
, list
, tuple
и т. Д. Это означает, что вы не можете использовать типы аналогичны классам, например, вы не можете изменять класс экземпляра типа, вы не можете добавлять, удалять или модифицировать методы типов и т. д. Следующая расшифровка показывает разницу в поведении между типами, такими как str
(жестко запрограммированные, нединамические конструкции C) и классы, которые я назвал A и B (изменяемые, динамические конструкции Python):
>>> str
<type 'str'>
>>> class A:
... pass
...
>>> a = A()
>>> A
<class __main__.A at 0xb747f2cc>
>>> a
<__main__.A instance at 0xb747e74c>
>>> type(a)
<type 'instance'>
>>> type(A)
<type 'classobj'>
>>> type(str)
<type 'type'>
>>> type(type(a))
<type 'type'>
>>> type(type(A))
<type 'type'>
>>> A.foo = lambda self,x: x
>>> a.foo(10)
10
>>> A().foo(5)
5
>>> str.foo = lambda self,x: x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'str'
>>> 'abc'.foo(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'foo'
>>> class B:
... pass
...
>>> a.__class__
<class __main__.A at 0xb747f2cc>
>>> a.__class__ = B
>>> a
<__main__.B instance at 0xb747e74c>
>>> 'abc'.__class__
<type 'str'>
>>> 'abc'.__class__ = B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ must be set to new-style class, not 'classobj' object
>>> class B(object):
... pass
...
>>> 'abc'.__class__ = B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: only for heap types