2010-06-10 2 views
11

Ich möchte in der Lage sein zu tun:Wann und wie kann ich den __class__ attr eines Objekts ändern?

>>> class a(str): 
...  pass 
... 
>>> b = a() 
>>> b.__class__ = str 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __class__ assignment: only for heap types 
+0

eng verwandt: http://stackoverflow.com/questions/990758/reclassing-an-instance-in-python – balpha

+0

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

Antwort

6

ich es in diesem gelöst habe Weg:

+0

Sehr-sehr großen Dank! Ich habe viele Stunden damit verbracht, das zu lösen! – seriyPS

1

Nur Klassen, die mit einem class Schlüsselwort definiert wurden, können für __class__ Attribut Zuordnung verwendet werden:

>>> class C: 
    pass 

>>> class D: 
    pass 

>>> C().__class__ = D 
>>> 
+0

Nein, das ist es nicht. –

+0

Das ist nicht, was sie hier sagen: http: //bytes.com/topic/python/answers/449635-assigning-self-__class__ –

+0

In der Tat, ich denke, "__mro__" ist das einzige schreibgeschützte Attribut dort. –

6

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 
+0

Alles in Python 2 ist eine Objektinstanz. –

+0

Sie meinen, dass nicht alle Klassen Instanzen des Typs sind. –

Verwandte Themen