谁能解释这个代码

蜜蜂..

令人困惑的是,在下面的代码“ gotProtocol”中传递了回调函数。使用示例服务器程序执行此代码时,它可以使用我们在类greeter中注册的方法“ sendMessage”发送这些字符串。但是如何?

from twisted.internet import reactor
from twisted.internet.protocol import Factory, Protocol
from twisted.internet.endpoints import TCP4ClientEndpoint

class Greeter(Protocol):
    def sendMessage(self, msg):
        self.transport.write("MESSAGE %s\n" % msg)

class GreeterFactory(Factory):
    def buildProtocol(self, addr):
        return Greeter()

def gotProtocol(p):
    p.sendMessage("Hello")
    reactor.callLater(1, p.sendMessage, "This is sent in a second")
    reactor.callLater(2, p.transport.loseConnection)

point = TCP4ClientEndpoint(reactor, "localhost", 1234)
d = point.connect(GreeterFactory())
d.addCallback(gotProtocol)
reactor.run()
保罗·鲁尼

它的异步编程。刚开始时可能会有些混乱。基本思想是定义函数并将它们传递给库,并且它将在需要时执行它们。

gotProtocol是一个回调函数。addCallback没有调用它,该函数将作为参数传递并存储以供以后调用。

变量p表示在扭曲调用独立函数时将传递的值,并将gotProtocol提供函数上下文(即,您将需要操作某些东西)。

展示一个非常简单的例子

import time
# imagine this function is defined in a library
def libraryfunc(cb):
    time.sleep(1)
    cb(1)

# your callback function that will be called later by library
def mycb(i):
    print "the library returned me %d" % i

libraryfunc(mycb)

您向库传递了一个函数,稍后它将通过调用该函数将返回的内容传递给您。

p将是一个Greeter实例。由于Greeter继承自Protocol它可用于多态Protocol内部被扭曲的对象,但是当你收到它,你可以调用额外的方法具体到GreetersendMessage,以及从继承的方法Protocol,将做networky东西如self.transport.write

至于如何以及何时Greeter创建实例。您提供了一个工厂类该类将返回的实例,Greeter因此可以在需要时创建该实例,然后在回调中将其返回给您。工厂方法的优点是,只要该类从其可用继承而来,twisted不需要知道其实例化具体Protocol

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章