IClassの最後の行は正確に何をしますか?
subclasscheckはsubclasscheckをオーバーロードしますが、通常、演算子をオーバーロードしている間、次のようなことを行います。
ここでadt+4.0、adtはユーザー定義型=ユーザークラスobject(instance)であり、4.0は組み込み型であり、.real、.imaginaryが事前構成されているため、adtが複雑な場合、これは次のようになります。adt。(self、other ) add(self、other)を使用すると、「adt」への参照が生成され、「self」にフィードされ、「other」は4.0を参照します。
しかし、以下の例では:
class IClass(object):
def __init__(self):
self.implementors = set()
def register(self,C):
self.implementors.add(C)
def __instancecheck__(self,x):
return self.__subclasscheck__(type(x))
def __subclasscheck__(self,sub):
return any(c in self.implementors for c in sub.mro())
# Now, use the above object
IFoo = IClass()
IFoo.register(Foo)
IFoo.register(FooProxy)
f = Foo() # Create a Foo
g = FooProxy(f) # Create a FooProxy
isinstance(f, IFoo) # Returns True
isinstance(g, IFoo) # Returns True
issubclass(FooProxy, IFoo) # Returns True
ここで、サブクラスチェックの自己とサブとは何ですか?サブクラスチェックはどのよう にオーバーロードされていますか?
とにかく、それが何らかの形でオーバーロードされていると仮定すると、FooProxyへの参照がselfとIFoo->subに渡されます。したがって、.. IFoo.mro()は、たとえばIFooのメソッド解決順序を生成します。したがって、IClass ..の場合、これは単なるオブジェクトになります。
誰かがここで何が起こっているのか説明できますか?基本的に、FooProxyがIClassのグループ化されたクラスのサブクラスである場合、「any」はTrueを返す必要があります。