【问题标题】:Importing from sub class Python从子类 Python 导入
【发布时间】:2016-04-15 12:03:32
【问题描述】:

这是我的名为Game_Factors的python文件:

from Fesnoria_Game_Setup import Game_Setup

class Game_Events(Game_Setup):
    def __init__(self):
        super(Game_Events, self).game_setup(self.MAP_FILENAME, self.GS)        

我正在导入包含子类Setup 的类Game_Setup

Setup 子类中,我有两个变量,一个叫self.MAP_FILENAME,另一个叫self.GS,我在导入Game_Setup 类时将其用作参数。

但是,当使用 self.MAP_FILENAMEself.GS 作为参数导入 Game_Setup 类时,我得到了错误代码:

AttributeError: 'Game_Factors' object has no attribute 'MAP_FILENAME'

有什么办法可以解决这个问题吗?

游戏设置:

class Game_Setup(Setup):
    def __init__(self)
        super(Game_Setup, self).__init__()   

【问题讨论】:

  • 不,因为SetupGame_Setup 的子类,当我单独导入它们时,我得到:TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases Game_Setup, Setup
  • 你能分享一个你写过Game_Setup的模块的sn-p吗?
  • 你去我给你放好了
  • 您尝试在属性创建之前访问它。
  • 那我该怎么办?

标签: python python-2.7 class arguments


【解决方案1】:

试试这个:

def __init__(self):
        super(Game_Events, self).__init__()
        self.game_setup(self.MAP_FILENAME, self.GS)

【讨论】:

    【解决方案2】:
    $ cat game_event.py 
    
    from game_setup import Game_Setup
    
    class Game_Event(Game_Setup):
    
        def __init__(self):
            super(Game_Event, self).__init__()
    
            print self.MAP_FILENAME
    
    ge = Game_Event()
    
    $ cat game_setup.py
    from setup import Setup
    
    class Game_Setup(Setup):
    
        def __init__(self):
            super(Game_Setup, self).__init__()
    
    
    $ cat setup.py
    
    class Setup(object):
    
        def __init__(self):
            self.MAP_FILENAME = 'myfile.py'
            self.GS = 'GS'
    

    类似上面的。

    【讨论】:

      【解决方案3】:

      如果我正确理解您在那里描述的内容,原因是您在__init__ 内的Game_Events 中没有self.MAP_FILENAMEself.GS,因为它们在__init__Setup 中定义超类,在这个地方没有被调用。超类的构造函数不会被隐式调用,所以添加对超类的__init__的调用:

      from Fesnoria_Game_Setup import Game_Setup
      
      class Game_Events(Game_Setup):
          def __init__(self):
              super(Game_Events, self).__init__()
              super(Game_Events, self).game_setup(self.MAP_FILENAME, self.GS)
      

      这样它应该可以工作。

      注意:如果您决定使用super(cls, self),请在您的代码中始终如一地使用它,否则由于 MRO 的工作方式,您稍后可能无法在继承树中获得您期望的结果。

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 2013-02-19
        • 1970-01-01
        相关资源
        最近更新 更多