我正在关注这个explanation,我不太了解Python解释器如何得到以下内容。在第一个示例中,Python看到@implementer(IAmericanSocket)
未实现UKSocket
,然后它决定将其设为AdaptToAmericanSocket
,因为这是IAmericanSocket
的唯一实现,只有一个参数?如果有另一个类实例用一个参数实现IAmericanSocket
怎么办?在第二个示例中,为什么IAmericanSocket
不会覆盖AmericanSocket
的电压方法?
>>> IAmericanSocket(uk)
<__main__.AdaptToAmericanSocket instance at 0x1a5120>
>>> IAmericanSocket(am)
<__main__.AmericanSocket instance at 0x36bff0>
使用以下代码:
from zope.interface import Interface, implementer
from twisted.python import components
class IAmericanSocket(Interface):
def voltage():
"""
Return the voltage produced by this socket object, as an integer.
"""
@implementer(IAmericanSocket)
class AmericanSocket:
def voltage(self):
return 120
class UKSocket:
def voltage(self):
return 240
@implementer(IAmericanSocket)
class AdaptToAmericanSocket:
def __init__(self, original):
self.original = original
def voltage(self):
return self.original.voltage() / 2
components.registerAdapter(
AdaptToAmericanSocket,
UKSocket,
IAmericanSocket)
答案 0 :(得分:1)
您可以在此处查看zope.interface的完整文档:http://docs.zope.org/zope.interface/ - 它可能提供比Twisted快速教程更全面的介绍。
要回答您的具体问题,最后registerAdapter
来电会改变调用IAmericanSocket
的行为。
当您调用Interface
时,它首先检查其参数是否提供。由于课程AmericanSocket
实施 IAmericanSocket
,AmericanSocket
的实例会提供 IAmericanSocket
。这意味着当您使用IAmercianSocket
实例的参数调用AmericanSocket
时,您只需返回实例。
但是,当参数不提供接口时,接口会搜索 adapters ,它可以将参数 提供的内容转换为目标接口。 (&#34;搜索适配器&#34;是一个非常过于简单化,但Twisted&#39; s registerAdapter
专门用于允许这种简化。)
因此,当使用IAmericanSocket
的实例调用UKSocket
时,它会从UKSocket
的实例中找到已注册的适配器。适配器本身是一个1参数可调用的,它接受一个被调整的类型的参数&#34;来自&#34; (UKSocket
)并返回正在调整的类型的值&#34;到&#34; (IAmericanSocket
的提供者)。 AdaptToAmericanSocket
是一个类,但是类本身是可调用的,并且由于它的构造函数采用UKSocket
,因此它符合事物的契约 - 即 - 1 - 参数类型 - {{1} } -and-返回安 - UKSocket
除非将其注册为适配器,否则另一个类的存在不会产生任何影响。如果您注册两个可能都适合的适配器,它们的交互很复杂,但由于它们都能完成这项工作,理论上您不应该关心使用哪个适配器。