Python界面如何工作(在Twisted中)?

时间:2015-07-30 00:13:28

标签: python interface twisted

我正在关注这个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)

1 个答案:

答案 0 :(得分:1)

您可以在此处查看zope.interface的完整文档:http://docs.zope.org/zope.interface/ - 它可能提供比Twisted快速教程更全面的介绍。

要回答您的具体问题,最后registerAdapter来电会改变调用IAmericanSocket的行为。

当您调用Interface时,它首先检查其参数是否提供。由于课程AmericanSocket 实施 IAmericanSocketAmericanSocket 的实例会提供 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

除非将其注册为适配器,否则另一个类的存在不会产生任何影响。如果您注册两个可能都适合的适配器,它们的交互很复杂,但由于它们都能完成这项工作,理论上您不应该关心使用哪个适配器。