0

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を返す必要があります。

4

1 に答える 1

0

__subclasscheck__組み込みをオーバーライドするメソッドissubclassです。呼び出しはissubclass(X,Y)最初に存在するかどうかをチェックし、存在する場合は通常の実装の代わりに Y.__subclasscheck__呼び出します。 同様に; 組み込みをオーバーライドするメソッドです。呼び出しは最初に存在するかどうかをチェック し、存在する場合 は通常の実装の代わりに 呼び出します。Y.__subclasscheck__(X)

__instancecheck__isinstanceisinstance(X, Y)Y.__instancecheck__Y.__instancecheck__(X)

In [121]: class FooProxy3(object):
     ...:     pass

In [122]: issubclass(FooProxy3,IFoo)
Out[122]: False

In [123]: for c in IFoo.implementors:
     ...:     print c
     ...:     
<class '__main__.Foo'>
<class '__main__.FooProxy'>

In [124]: for c in FooProxy3.mro():
     ...:     print c
     ...:     
<class '__main__.FooProxy3'>
<type 'object'>

In [125]: IFoo.register(FooProxy3)

In [126]: for c in IFoo.implementors:
     ...:     print c
     ...:     
<class '__main__.Foo'>
<class '__main__.FooProxy'>
<class '__main__.FooProxy3'>

In [127]: issubclass(FooProxy3,IFoo)
Out[127]: True

上記の例を考えてみましょう;新しいクラスを作成しますFooProxy3; そしてそれをチェックissubclassします。サブクラスチェックインを探しているので、False(のように)返されます。そしてそこには(のように)存在しませんが 、私たちが存在するとき(ここではそれは意味します;今私たちはそれを見ることができます); (のように)それを見ることができるので、チェックすると; それは戻ります。 詳細については; インスタンスとサブクラスのチェックのカスタマイズisinstance()とissubclass()のオーバーロードOut[122]IFoo.implementorsIn[123]
register FooProxyIFoo.implementorsFoxproxy3IFoo.implementorsIn[126]issubclassTrue


于 2013-01-19T12:12:59.710 に答える