Когда где и как я могу изменить __class__ attr объекта?

Я хотел бы иметь возможность сделать:

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

3 Solutions collect form web for “Когда где и как я могу изменить __class__ attr объекта?”

Python 2 не имеет единой иерархии объектов (т. Е. Не все происходит от класса объекта). Все, что является частью этой иерархии, может воспроизводиться через класс , но те, которые не могут быть изменены таким образом (или вообще, действительно). Они называются «типами» Python, и они жестко закодированы в C. Примерами типов являются str, int, float, list, tuple и т. Д. Это означает, что вы не можете использовать типы так же, как классы, например вы не можете изменить класс экземпляра типа, вы не можете добавлять, удалять или изменять методы типов и т. д. В следующем расшифровке показана разница в поведении между типами, такими как 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 C(str): ... def __getattribute__(self, name): ... if name == '__class__': ... return str ... else: ... return super(C, self).__getattribute__(name) ... >>> c = C() >>> c.__class__ <type 'str'> 

Только классы, которые были определены с ключевым словом class могут использоваться для __class__ атрибута __class__ :

 >>> class C: pass >>> class D: pass >>> C().__class__ = D >>> 
  • Python: реализация среза в __getitem__
  • Есть ли встроенная функция для печати всех текущих свойств и значений объекта?
  • Получить класс, который определил метод
  • Оператор умножения, применяемый к списку (структуре данных)
  • Как вы проверяете, связан ли метод python или нет?
  • Python - лучший язык программирования в мире.