SocketServer AttributeError:实例没有属性' request'

时间:2015-03-07 02:07:47

标签: python python-2.7 python-3.x serversocket

我对这个迷你游戏有一个问题,我试图添加到服务器。

我正在尝试从一个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'

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

1 个答案:

答案 0 :(得分:0)

您已选择在课程Character中安排课程ThreadedTCPRequestHandler&c; 嵌入 - 但嵌入式与派生自非常不同>。嵌入式类无法访问嵌入它们的类的self

因此,您需要使用Character__init__来充实,handler实例会创建它:

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

(我也借此机会制作名称和年龄实例变量,这更有意义,并将缩进更改为标准4个字符与您使用的2: - )。

然后,子类必须适当地调用基类__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=部分只是为了清晰和可读性,功能并非严格要求: - )。

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