gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:20 25 4
gpt4 key购买 nike

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

最佳答案

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

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

当您调用接口(interface)时,它首先检查其参数是否提供本身。由于类 AmericanSocket 实现 IAmericanSocketAmericanSocket 的实例提供 IAmericanSocket 。这意味着当您使用 AmericanSocket 实例的参数调用 IAmercianSocket 时,您只需取回该实例。

但是,当参数尚未提供接口(interface)时,接口(interface)会搜索适配器,适配器可以将参数提供的内容转换为目标接口(interface)。 (“搜索适配器”是一个巨大的过度简化,但 Twisted 的 registerAdapter 的存在是专门为了允许这种类型的简化而存在的。)

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

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

关于python - Python 界面如何工作(在 Twisted 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31713257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com