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。