谁能解释这段代码

时间:2015-03-09 11:33:30

标签: python twisted

有一个混乱,在下面的代码中将“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()

1 个答案:

答案 0 :(得分:1)

它的异步编程。起初可能有点混乱。基本思想是定义函数并将它们传递给库,并在需要时执行它们。

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,因此可以在内部使用polymorphically作为Protocol对象进行扭曲,但是当您收到它时,您可以调用特定于{{{ 1}} class Greeter以及从sendMessage继承的方法,它们将执行网络内容,例如Protocol

关于如何以及何时创建self.transport.write实例。您提供了factory class,它将返回Greeter的实例,因此可以在需要时创建实例并在回调中将其返回给您。工厂方法的优点是,扭曲并不需要知道它正在实例化的concrete类,只要该类继承Greeter它可用。