ada*_*ith 19 python python-3.x
在这个python doc页面上,它说:
与其身份一样,对象的类型也是不可更改的.
我试试这个剧本,
#!python3
class Foo:
num = 1
pass
class Bar:
num = 2
pass
f1,f2= Foo(), Foo()
f2.__class__ = Bar
print( type(f1), type(f2), f1.num, f2.num )
Run Code Online (Sandbox Code Playgroud)
结果显示:
<class '__main__.Foo'> <class '__main__.Bar'> 1 2
我觉得我改变了type的f2.
怎么了,我错过了什么?
HYR*_*YRY 15
页面上的脚注是:
[1]在某些情况下,可以在某些受控条件下更改对象的类型.但它通常不是一个好主意,因为如果处理不当会导致一些非常奇怪的行为.
如果您尝试将__class__f2 更改为list:
f2.__class__ = list
Run Code Online (Sandbox Code Playgroud)
引发的TypeError:
TypeError: __class__ assignment: only for heap types
Run Code Online (Sandbox Code Playgroud)
如果要向无法更改的某些代码创建的对象添加功能,则更改类型(“广播”)很有意义。
假设有一些陈述obj = some_call_to_a_library()给你一个类的对象A。您希望它具有其他功能,例如mymethod()。然后,您可以引入这样的子MyA类(Python 3样式):
class MyA(A):
@classmethod
def cast(cls, some_a: A):
"""Cast an A into a MyA."""
assert isinstance(some_a, A)
some_a.__class__ = cls # now mymethod() is available
assert isinstance(some_a, MyA)
return some_a
def mymethod(self):
...
Run Code Online (Sandbox Code Playgroud)
然后写obj = MyA.cast(some_call_to_a_library())。如果MyA依赖于其他属性cast(这是一种工厂方法),则应创建它们。
当我需要一个requests.Response可以持久保存并从文件中检索响应的版本时,我就做了这样的事情。