Question

Je voudrais pouvoir faire:

>>> 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
Était-ce utile?

La solution

Je l'ai résolu de cette façon:

>>> class C(str):
...     def __getattribute__(self, name):
...         if name == '__class__':
...             return str
...         else:
...             return super(C, self).__getattribute__(name)
...         
>>> c = C()
>>> c.__class__
<type 'str'>

Autres conseils

Python 2 ne dispose pas d'une hiérarchie d'objets unifié (ie. Pas tout est descendu de la classe d'objets). Tout ce qui fait partie de cette hiérarchie peut être joué avec par __class__, mais ceux qui ne sont pas ne peuvent être modifiés de cette manière (ou pas du tout, vraiment). On les appelle les « types », et ils sont codés en dur dans C. Des exemples de types sont str, int, float, list, tuple, etc. Python Cela signifie que vous ne pouvez pas utiliser des types de la même manière que les classes, par exemple vous ne pouvez pas changer la classe d'une instance d'un type, vous ne pouvez pas ajouter, supprimer ou modifier les méthodes de types, etc. la transcription ci-dessous montre la différence de comportement entre les types tels que str (codé en dur, des constructions C non dynamiques) et cours que j'ai appelé A et B (modifiable, dynamique, constructions 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

Seules les classes qui ont été définies avec un mot-clé class pourraient être utilisés pour l'attribution d'attribut __class__:

>>> class C:
    pass

>>> class D:
    pass

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

J'ai essayé de cette façon!

>>> class C(str):
...     __class__ = str
...
>>> c = C()
>>> c.__class__
<class 'str'>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top