【问题标题】:SocketServer AttributeError: Instance has no attribute 'request'SocketServer AttributeError:实例没有属性“请求”
【发布时间】:2015-03-07 02:07:46
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    (我还借此机会制作了 name 和 age instance 变量,这更有意义,并将缩进更改为标准的 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 中很少使用),但至少它可以工作!-)

    【讨论】:

    • 哇,谢谢!这更有意义。还有1个问题,如果很少使用嵌入式类,如果没有嵌入,如何创建相同的东西?我必须拥有 ThreadedHandler 之外的所有东西吗?只是要求将来参考。
    • 您会将所有现在嵌入的class 语句移到class ThreadedHandler 语句之外,并在p1 = self.Boy("Jim", self) 中丢失self.。将类放在“外部”可以更轻松地为您的代码编写单元测试——丰富的单元测试不仅仅是“最佳实践”,它们是您应该唯一的实践永远考虑!-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多