0

IClass 的最后一行到底是做什么的?

subclasscheck重载 subclasscheck 但是,通常在重载运算符时,我们会执行以下操作:

adt + 4.0 在这里,adt 是用户定义的类型 = 用户类对象(实例),而 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

这里subclasscheck的 self 和 sub 是什么?subclasscheck是如何 重载的?

无论如何,假设它以某种方式被重载.. 对 FooProxy 的引用被传递给 self 和 IFoo->sub。所以.. IFoo.mro() 将生成例如 IFoo 的方法解析顺序,因此对于 IClass.. 这将只是 object.. umm.. wth??

有人可以解释这里发生了什么吗?如果 FooProxy 是 IClass 中分组类的子类,则基本上“任何”都应该返回 True。

4

1 回答 1

0

__subclasscheck__是覆盖内置的方法issubclass。该调用issubclass(X,Y)首先检查是否Y.__subclasscheck__存在,如果存在,则调用Y.__subclasscheck__(X)而不是其正常实现。

相似地; __instancecheck__是覆盖内置的方法isinstance。该调用isinstance(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(根据Out[122]),因为我们正在寻找子类签入IFoo.implementors;并且它不存在(根据In[123]
,但是当我们存在时register FooProxy(这里的意思是;现在我们可以看到它IFoo.implementors);我们可以Foxproxy3IFoo.implementors(根据In[126])中看到它,所以当我们检查时issubclass;它会回来True的。
了解更多信息;
自定义实例和子类检查
重载 isinstance() 和 issubclass()

于 2013-01-19T12:12:59.710 回答