何时以及如何更改对象的__class__ attr?

时间:2010-06-10 09:45:01

标签: python python-datamodel

我希望能够做到:

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

4 个答案:

答案 0 :(得分:8)

我用这种方式解决了它:

>>> 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'>

答案 1 :(得分:6)

Python 2没有统一的对象层次结构(即,并非所有内容都来自对象类)。任何属于此层次结构的东西都可以通过__class__来播放,但那些不能以这种方式(或者根本就是真的)进行修改。这些被称为Python的“类型”,它们在C中被硬编码。类型的示例包括strintfloatlist,{{1}这意味着您不能以与类相同的方式使用类型,例如,您无法更改类型实例的类,您无法添加,删除或修改类型的方法等。以下脚本显示类型之间的行为差​​异,例如tuple(硬编码,非动态C构造)和我称为A和B的类(可变,动态,Python构造):

str

答案 2 :(得分:0)

只有使用class关键字定义的类才可用于__class__属性分配:

>>> class C:
    pass

>>> class D:
    pass

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

答案 3 :(得分:0)

我尝试过这种方式!

>>> class C(str):
...     __class__ = str
...
>>> c = C()
>>> c.__class__
<class 'str'>