SocketServer AttributeError: Instance has no attribute 'request'

SocketServer AttributeError: Instance has no attribute 'request'

我制作的这个小游戏有问题,我想将它添加到服务器。

我正在尝试从 Character 的实例打印一个函数,但我不确定如何传递正确的函数。 这就是我所拥有的:

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
  Class Character():
    name = ""
    age = 0

  Class Human(Character):
    locationX = 0
    locationY = 0
    def help(self):
      self.request.send("Q to Quit")

  class Boy(Character, Human):
    def __init__(self, name):
      self.name = name
      age = 10

  def handle(self):
    p1 = self.Boy("Jim")

    self.request.send(":")
    command = self.request.recv(1024).strip()
    if command == "help":
      p1.help()

我的错误是:

    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__
      self.handle()
    File "rpg.py", line 281, in handle
      p1.help()
    File "rpg.py", line 23, in help
      self.request.send("Q to Quit")
    AttributeError: Boy instance has no attribute 'request'

有人可以解释为什么这是错误的吗?

您已选择将 classes Character &c 嵌入 class ThreadedTCPRequestHandler -- 但嵌入与 派生自 非常不同。嵌入的 classes 没有对嵌入它们的 class 的 self 的特殊访问权限!

因此您需要使用 __init__ 来丰富 Character,该 __init__ 使用 handler 实例来创建它:

  class Character():
      def __init__(self, handler):
          self.name = ""
          self.age = 0
          self.handler = handler

(我也借此机会创建了 name 和 age instance 变量,这更有意义,并将缩进更改为标准的 4 个字符,而不是您使用的 2 个字符:- ).

Subclasses 必须适当地调用基础 class 的 __init__

  class Boy(Character, Human):
      def __init__(self, name, handler):
          Character.__init__(self, handler)
          self.name = name
          self.age = 10

并且新实例的创建也必须一起进行:

  def handle(self):
      p1 = self.Boy("Jim", handler=self)
      # etc etc

(这里的 handler= 部分只是为了清晰和可读性,并不是功能所必需的:-)。

整体架构现在很奇特(嵌入式classes在Python中很少使用)但至少它会起作用!-)