【问题标题】:Object has no attribute - Python OOP对象没有属性 - Python OOP
【发布时间】:2020-03-29 12:23:29
【问题描述】:

这是我无法工作的代码。就是说当我尝试使用player1.score 获取 player1 和 player2 分数时,我的对象没有 score 属性。我检查了缩进错误,但没有找到。我不确定为什么缺少分数,因为我已经给了它self。我引入了带有player1 = Player(PLAYER1, 1, DEFAULT_SETS) 的类对象,其中 PLAYER1 和 DEFAULT_SETS 是我在设置文件中设置的变量。错误出现在 Game 类中代码的 #points 部分。

class Game:
    #Init function to start the game variables
    def __init__(self):
        pg.init()
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        pg.display.set_caption(TITLE)
        self.clock = pg.time.Clock()
        pg.key.set_repeat(500,100)
        #self.screen_scenario = WELCOME
        self.load_data()
        self.Game_Deuce = False
        self.Game_Tiebreaker = False
        #self.Game_Winner = False
        self.sets = DEFAULT_SETS
        self.serve = random.choice([1,2])

        #Function to start a new game
        def new(self):
            self.paused = False
            self.screen.fill(DARKGREEN)
            player1 = Player(PLAYER1, 1, DEFAULT_SETS)
            player2 = Player(PLAYER2, 0, DEFAULT_SETS)


        #Function to run the scoreboard
        def run(self):
            self.playing = True
            #pg.mixer.music.play(loops=-1)
            #pg.mixer.music.set_volume(BG_MUSIC_VOLUME)
            while self.playing:
                self.dt = self.clock.tick(FPS) / 1000
                self.events()
                if not self.paused:
                    self.update()
                self.draw()


            #Points
            self.draw_text(str(POINTS[player1.score]), self.points_font, 180, YELLOW, POINTS_BOX_X_2, POINTS_BOX_Y_2)
            self.draw_text(str(POINTS[player2.score]), self.points_font, 180, YELLOW, POINTS_BOX_X_1, POINTS_BOX_Y_1)

这是一个单独的文件,但已正确导入:

    class Player:
        def __init__(self, name, serving, sets):
            self.name = name
            sets = sets
            self.score = int(0)
            self.games = int(0)
            self.sets = int(0)
            self.advantage = False
            if serving == 1:
                self.serving = True

【问题讨论】:

  • 确保重启python进程以检查重新导入错误。如果您将其作为脚本运行,则应该不是问题。
  • 请使用错误的完整追溯更新您的问题。
  • 在函数new 中设置player1 = Player(PLAYER1, 1, DEFAULT_SETS)player1 是该函数的本地函数,因此您不能在函数 run 中使用它。顺便说一句,你的缩进看起来很糟糕。 newrun 真的应该是 __init__ 方法的本地函数吗?
  • @mathtick 难以置信,这确实有效。非常感谢我把头发拉出来了……
  • 是的,应该有一个常见原因的错误流程图。 Stack-overflow几乎是这样,但不是真的。

标签: python oop object attributes


【解决方案1】:

@mathtick “确保重新启动 python 进程以检查重新导入错误。如果您将其作为脚本运行,则应该不是问题”

@马提亚斯 "在函数 new 中你设置 player1 = Player(PLAYER1, 1, DEFAULT_SETS)。player1 是该函数的本地,所以你不能在函数运行中使用它"

我将 self 添加到 Matthias 指出并重新启动 Python 并修复它的变量中

还有更新/提示:

如果你真的想“欺骗” importlib.reload 是你的敌人。我通常把它放在我的 IPython onstart.py 中:

from importlib import reload

然后在 IPython 中,我生活在这个人类开发循环中:

In [29]: import my.lib as m                                                                                                                                                                                        

In [30]: # edit code                                                                                                                                                                                               

In [31]: reload(m)

请记住,这不会重新加载所有模块。如果您有其他文件,您也需要以正确的顺序重新加载它们。在 IPython REPL 中使用向上箭头。有自动重载库,但我不相信它们总能把事情做好,你会发疯的。请记住,重新加载是一个狡猾的开发黑客,并非一切都总是有效。作弊时使用它,但如果事情变得奇怪,请重新启动。生存并重复。

【讨论】: