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