Python,从另一个类调用类方法

1 投票
1 回答
8016 浏览
提问于 2025-04-17 15:59

请问有没有人能帮我(新手)在process类中调用BroadcastServerFactory类里的broadcast function,具体代码见附件

我尝试了很多方法来从另一个类调用一个函数,但都没有找到解决办法

import time, sys
from apscheduler.scheduler import Scheduler
import threading
import socket
from twisted.internet import reactor
from twisted.python import log
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.websocket import WebSocketServerFactory, \
                               WebSocketServerProtocol, \
                               listenWS


class process(threading.Thread):
    def __init__(self, buffer3):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.buffer3 = buffer3


    def run(self):
        factory.broadcast("I don't know what I'm doing!")



class BroadcastServerProtocol(WebSocketServerProtocol):

   def onOpen(self):
      self.factory.register(self)

   def onMessage(self, msg, binary):
      if not binary:
         self.factory.broadcast("'%s' from %s" % (msg, self.peerstr))

   def connectionLost(self, reason):
      WebSocketServerProtocol.connectionLost(self, reason)
      self.factory.unregister(self)


class BroadcastServerFactory(WebSocketServerFactory):
   """
   Simple broadcast server broadcasting any message it receives to all
   currently connected clients.
   """

   def __init__(self, url, debug = False, debugCodePaths = False):
      WebSocketServerFactory.__init__(self, url, debug = debug, debugCodePaths = debugCodePaths)
      self.clients = []
      self.tickcount = 0
      self.tick()

   def tick(self):
      self.tickcount += 1
      self.broadcast("'tick %d' from server" % self.tickcount)
      reactor.callLater(1, self.tick)

   def register(self, client):
      if not client in self.clients:
         print "registered client " + client.peerstr
         self.clients.append(client)

   def unregister(self, client):
      if client in self.clients:
         print "unregistered client " + client.peerstr
         self.clients.remove(client)

   def broadcast(self, msg):
      print "broadcasting message '%s' .." % msg
      for c in self.clients:
         c.sendMessage(msg)
         print "message sent to " + c.peerstr


class BroadcastPreparedServerFactory(BroadcastServerFactory):
   """
   Functionally same as above, but optimized broadcast using
   prepareMessage and sendPreparedMessage.
   """

   def broadcast(self, msg):
      print "broadcasting prepared message '%s' .." % msg
      preparedMsg = self.prepareMessage(msg)
      for c in self.clients:
         c.sendPreparedMessage(preparedMsg)
         print "prepared message sent to " + c.peerstr


def testing():
    buffer2 - "hello"
    myDisplay = process(buffer2)
    myDisplay.start()


if __name__ == '__main__':

   if len(sys.argv) > 1 and sys.argv[1] == 'debug':
      log.startLogging(sys.stdout)
      debug = True
   else:
      debug = False
   level_scheduler = Scheduler()
   level_scheduler.add_interval_job(testing, seconds=5)
   level_scheduler.start()
   #ServerFactory = BroadcastServerFactory
   ServerFactory = BroadcastPreparedServerFactory

   factory = ServerFactory("ws://localhost:9000",
                           debug = debug,
                           debugCodePaths = debug)

   factory.protocol = BroadcastServerProtocol
   factory.setProtocolOptions(allowHixie76 = True)
   listenWS(factory)

   webdir = File(".")
   web = Site(webdir)
   reactor.listenTCP(8080, web)


   reactor.run()

谢谢

1 个回答

1

在创建的时候,把 BroadcastServerFactory 这个类的实例传递给调用它的类实例的 process 方法。

class process(threading.Thread):
    def __init__(self, buffer3m, broadcast_server_factory):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.buffer3 = buffer3

        self.factory = broadcast_server_factory

    def run(self):
        self.factory.broadcast("I don't know what I'm doing!")

然后调用它(在 run 语句中,它被赋值为 self.factory)。我没有看到你在 __main__ 中创建 process 类,但它会像这样被创建:

 p = process(buffer, factory)

顺便提一下,在 Python 中,类名使用大写字母是个好习惯,比如把 process 改成 Process

撰写回答