【问题标题】:How does Python interface work (in Twisted)?Python 接口如何工作(在 Twisted 中)?
【发布时间】:2015-07-30 00:13:28
【问题描述】:

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

【问题讨论】:

    标签: python interface twisted


    【解决方案1】:

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

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

    当您调用Interface 时,它首先会检查它的参数是否提供 本身。由于类AmericanSocket实现IAmericanSocketAmericanSocket的实例提供IAmericanSocket。这意味着,当您使用 AmericanSocket 实例的参数调用 IAmercianSocket 时,您只需获取该实例即可。

    然而,当参数没有提供接口时,接口会搜索适配器,它可以将参数提供的东西转换为目标接口。 (“搜索适配器”过于简单化了,但 Twisted 的 registerAdapter 专门用于允许这种类型的简化。)

    因此,当使用UKSocket 的实例调用IAmericanSocket 时,它会从UKSocket 的实例中找到已注册的适配器。适配器本身是一个 1-argument 可调用对象,它接受一个“来自”(UKSocket)类型的参数并返回一个“to”类型的值(IAmericanSocket 的提供者)。 AdaptToAmericanSocket 是一个类,但类本身是可调用的,并且由于其构造函数采用 UKSocket,因此它符合 thing-that-takes-1-argument-of-type-UKSocket-and-returns- 的约定一个-IAmericanSocket

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

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2015-11-20
      • 2012-09-24
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多