ときにどこで、どのように私は、オブジェクトの__class__ attrの変更できますか?

StackOverflow https://stackoverflow.com/questions/3013280

  •  26-09-2019
  •  | 
  •  

質問

I行うことができるようにしたいと思います:

>>> 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
役に立ちましたか?

解決

私はこの方法でそれを解決してきます:

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

他のヒント

のPython 2(すなわち。すべてが対象のクラスから派生されていない)統一オブジェクト階層を持っていません。この階層の一部であるものは、__class__経由で再生することができますが、そうでないものは(またはすべてで、本当に)この方法で変更することはできません。これらは、Pythonの「型」と呼ばれ、彼らはハードコーディングされます。たとえば、クラスと同じ方法で型を使用することができないなど、この手段、strintfloatlisttuple種類のC.例であります次転写ショー等、そのような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

classキーワードで定義されたクラスだけは__class__属性の割り当てのために使用することができます:

>>> class C:
    pass

>>> class D:
    pass

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

私はこの方法を試してみました!

>>> class C(str):
...     __class__ = str
...
>>> c = C()
>>> c.__class__
<class 'str'>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top