我遵循这个explanation,我不太明白Python解释器是如何到达下面的。在第一个例子中,Python是否看到@implementer(IAmericanSocket)
不是由UKSocket
实现的,那么它决定将其设为AdaptToAmericanSocket
,因为这是{IAmericanSocket
,会怎么样?在第二个例子中,为什么IAmericanSocket
没有覆盖AmericanSocket
的电压方法?在
>>> IAmericanSocket(uk)
<__main__.AdaptToAmericanSocket instance at 0x1a5120>
>>> IAmericanSocket(am)
<__main__.AmericanSocket instance at 0x36bff0>
代码如下:
^{pr2}$
您可以查看的完整文档zope.接口这里:http://docs.zope.org/zope.interface/-它可能提供比Twisted的快速教程更全面的介绍。在
为了回答您的特定问题,最后的}的行为。在
registerAdapter
调用改变了调用{当您调用
Interface
时,它首先检查它的参数是否提供本身。由于类AmericanSocket
实现了IAmericanSocket
,因此AmericanSocket
的实例提供了IAmericanSocket
。这意味着,当您使用AmericanSocket
实例的参数调用IAmercianSocket
时,您只需将实例取回。在但是,当参数尚未提供接口时,接口会搜索适配器,以将参数提供给目标接口的内容转换为适配器。(“搜索适配器”是一个巨大的过度简化,但是Twisted的
registerAdapter
是专门为这种简化而存在的。)因此,当使用
UKSocket
的实例调用IAmericanSocket
时,它会从UKSocket
的实例中找到已注册的适配器。适配器本身是一个1参数的可调用函数,它接受“from”(UKSocket
)类型的参数,并返回“to”类型的值(提供程序IAmericanSocket
)。AdaptToAmericanSocket
是一个类,但类本身是可调用的,由于其构造函数采用UKSocket
,因此它符合thing-that-takes-1-argument-of-type-UKSocket
-的约定,并返回一个-IAmericanSocket
。在另一个类的存在不会产生任何影响,除非它被注册为适配器。如果您注册两个可能都适合的适配器,那么它们的交互非常复杂,但是由于它们都能完成任务,理论上您不应该关心使用哪一个。在
相关问题 更多 >
编程相关推荐