2つの可能性
isinstance(second, A)
する代わりにisinstance(second.obj, A)
2番目...よりハックな方法は、次のようなことです:
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>