Python 2 hat keine einheitliche Objekthierarchie (dh nicht alles ist von der Objektklasse abstammt). Alles, was Teil dieser Hierarchie ist, kann über Klasse gespielt werden, aber diejenigen, die nicht sind, kann nicht auf diese Weise (oder überhaupt, wirklich) geändert werden. Diese heißen Pythons "Typen" und sind in C hart codiert. Beispiele für Typen sind str, int, float, list, tuple usw. Das bedeutet, dass Sie Typen nicht wie Klassen verwenden können Sie können die Klasse einer Instanz eines Typs nicht ändern, Sie können Methoden von Typen usw. nicht hinzufügen, entfernen oder ändern. Das folgende Transcript zeigt den Unterschied im Verhalten zwischen Typen wie str (fest codierte, nicht dynamische C-Konstrukte) und Klassen ich habe A und B genannt (änderbar, dynamisch, konstruiert 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
eng verwandt: http://stackoverflow.com/questions/990758/reclassing-an-instance-in-python – balpha
I‘ Ich möchte sagen, dass dies eine ziemlich schlechte Nachricht vom Interpreter ist, da der Begriff "Heap-Typ" den meisten Python-Programmierern nicht geläufig ist und es in Py anscheinend keinen Weg gibt thon 3, um eine Klasse zu erstellen, deren Instanzen eine zuweisbare __klasse__ haben. Oder zumindest habe ich keinen gefunden. – holdenweb