2 可能性
而不是isinstance(second, A)
做isinstance(second.obj, A)
第二......更hackish的方式是做这样的事情:
class B:
def __init__(self, obj):
self.obj = obj # obj is any object
self.__class__ = obj.__class__
这是骇人听闻的,因为它基本上使解释器误以为实例是不同的类。那就是isinstance(second, B)
会回来False
要回答下面提出的问题:解释器基本上会像second
一个类一样A
工作,并且在类级别定义的任何内容都B
不会保留。例如,如果你做类似的事情
class B:
b=2 #Won't be visible
def __init__(self, obj):
self.obj = obj # obj is any object
self.b2 = 5 #Instance variable will be visible
self.__class__ = obj.__class__
def someFunc(self): #Won't be visible
return 3
在此处使用与上面用于初始化的代码相同的代码是使用解释器进行某些调用时会发生的情况。通常,任何类变量或方法都将被删除,而是使用A
'a,但是任何实例变量都会被记住。因为这样做self.obj = obj
有点多余。基本上实例化B(obj)
或多或少会返回一个与obj
. 虽然它不会调用obj
's __init__
,但为此你需要更多的巫毒/魔法(如果你有兴趣就发帖)。
>>> isinstance(second, A)
True
>>> isinstance(second, B)
False
>>> second.a
1
>>> second.b
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
second.b
AttributeError: A instance has no attribute 'b'
>>> second.someFunc()
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
second.someFunc()
AttributeError: A instance has no attribute 'someFunc'
>>> second.b2
5
>>> second.obj
<__main__.A instance at 0x0123CAF8>