python:赋值给变量也赋值给类属性?

vmpqdwk3  于 2021-09-08  发布在  Java
关注(0)|答案(0)|浏览(256)

我没有发现任何类似的问题,我正在努力理解我的代码现在在做什么。
我正在用pygame编写一个小益智游戏,这也是我第一次尝试面向对象编程。pygame提供 Rect 对象来定义屏幕的一部分(具有以下属性 x , y , width , height ,等等)。因为我的游戏是文本密集型的,所以我创建了一个对象 Region a组 Rectfont 对象和一些颜色信息,以便在需要快速切换到屏幕时使用:

def __init__(self, rect, bg_color, font, font_color):
        self.rect = rect
        self.bg_color = bg_color
        self.font = font
        self.font_color = font_color

然后我创建了一个 Layout 类,该类将包含 Region 对象,以及一个集中的调色板和一些重绘屏幕元素的方法。因为这个游戏只有一个“棋盘”,所以我只需要一个 Layout 对象,所以我做了 Region 对象类属性:

...
   progress_box: region(pygame.Rect(5, 340, 275, 10),
                                   colors["white"],
                                   pygame.font.SysFont('arialblack', 12),
                                   colors["black"])

(为了便于阅读,剪掉了其他区域对象。)
在代码的后面,我有一个函数,它在 progress_box 像这样:

def display_progress(score, viz, max_score):
    progress = round(score/max_score, 4)
    progress_bar = region(viz.boxes["progress_box"].rect, "gold", None, None)
    progress_bar.rect.width = int(progress * progress_box.rect.width)
    viz.box_blit(progress_bar) ##viz is my layout object

据我所知,应该发生的是 progress_bar 复制 rect 属性自 progress_box 对象,但随后我重置了 width 属性的百分比 progress_box.rect 宽度。我没有给你分配任何东西 progress_box 本身,以及 progress_bar 是一个 Region 对象未连接到 Layout 类,所以我假设 progress_box.rect.width 将在每个循环中保持不变。
相反,无论我赋予什么价值 progress_bar.rect.width 也分配给 progress_box.rect.width . 当然,这意味着,在第一次通过循环时,这两个值都被设置为0,因为玩家的分数为0,此后它们永远不会改变。
如果我更改,该功能将按预期工作 progress_bar.rect.width = int(progress * progress_box.rect.width)progress_bar.rect.width = int(progress * 275) ,但这并不能解释为什么在我没有直接为变量赋值的情况下变量会发生变化。我知道这些属性只初始化一次,所以对类属性的任何更改都将在每个循环中保持不变——我只是不知道为什么它会在第一时间发生更改。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题