【问题标题】:global statement does not work as expected and cannot be accessed within a class全局语句无法按预期工作,无法在类中访问
【发布时间】:2021-04-21 19:07:48
【问题描述】:
screen = None #is defined outside of any function

def main():

    pygame.init()
    font = pygame.font.SysFont("Arial", 20)

    img_logo = pygame.image.load("gfx\Logo.png")
    img_logo = pygame.transform.smoothscale(img_logo, (30, 30))
    pygame.display.set_icon(img_logo)
    pygame.display.set_caption("Title")
    

    

    global screen # is set as global
    screen = pygame.display.set_mode((res)) #this works as intended and displays correctly



    running = True

    load.Menu(screen, res) 

  


    #----MAIN LOOP
    while running:
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONUP:
                Eventhandler.onClick()
  
            if event.type == pygame.QUIT:          
                running = False
    pygame.display.update()

class Button:
    global screen
    print(screen) # returns None
    def __init__(self, img, pos, size):
        self.img = img
        self.pos = pos
        self.size = size

当我在这样的单独文件中定义 Button 类的实例时:

button_start = Main.Button("button_start",[200, 550], [230, 100])

类中的 print(screen) 返回None,这意味着它无法访问screen,即使它在类的开头被声明为全局。似乎main() 只使用了一个本地实例,它实际上并没有改变函数外部的变量。但这意味着global screen 不起作用。

我错过了什么?这不是全局语句的工作方式吗?因为从我读到的内容来看,如果我在该函数中使用该语句,我应该能够在全局范围内更改变量,即使是在函数内本地也是如此。

【问题讨论】:

  • global screen 不是“在函数中”(Button.__init_)。类属性会立即评估,但不会在创建第一个对象时评估。

标签: python python-3.x pygame


【解决方案1】:

只需跟踪程序的执行,就会发现问题所在:类的主体是在其定义期间执行的。您的流程是将屏幕设置为None,定义main,并定义Body。最后一个定义包括执行print(screen),它仍然是None

最重要的是,任何使用global 强烈表明您的系统设计是易变的。请通过“正确”将任何需要的信息传递给类来替换您的全局使用——至少在您完全所有理解类和程序初始化的含义以及各种交互之前(到那时,您可能已经不再考虑全局了。:-) )。

【讨论】:

  • 谢谢!我只是将screen 传递给班级,并避免一起使用全局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2017-01-02
  • 2016-08-17
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多