微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

global 语句无法按预期工作,并且无法在类中访问

如何解决global 语句无法按预期工作,并且无法在类中访问

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 不起作用。

我错过了什么?这不是全局语句的工作原理吗?因为从我读到的内容来看,如果我在该函数中使用该语句,我应该能够在全局范围内甚至在函数内局部更改变量。

解决方法

简单地跟踪程序的执行将向您展示问题:类的主体在其定义期间执行。您的流程是将 screen 设置为 None,定义 main,然后定义 Body。最后一个定义包括执行 print(screen),它仍然是 None

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。