访问python类中的全局变量__init__

时间:2017-06-21 19:59:02

标签: python global-variables kivy

我遇到了在两个单独的类中访问全局声明的变量的问题。这是一个使用pandas进行后端支持的kivy应用程序。

以下是全局变量raw_data的初始化,以及最初修改它的位置(在show_raw_data func中):

# original dataframe
raw_data = None

class IntroScreen(Screen):

    def __init__ (self, **kwargs):
        super (IntroScreen, self).__init__(**kwargs)

        self.preview_screen_layout.add_widget(Button(text="View Raw Data", on_release=self.goto_raw_data))

    # switch to preview screen and show raw data when import is clicked
    def show_raw_data(self, *args):
        global file_path_list
        global raw_data
        try:

            # check input is correct
            if ".xlsx" in file_path_list["orig_data"]:
                raise ValueError
            else:
                # open csv file to display and display it
                raw_data = pd.read_csv(file_path_list["orig_data"])
                dfgui.show(raw_data)

                # move to next screen
                self.manager.current = 'preview_screen'

这是我试图访问的地方,能够显示使用pandas读取的数据:

class PreviewScreen(Screen):

    def __init__(self, **kwargs):
        super (PreviewScreen, self).__init__(**kwargs)

        global raw_data
        dfgui.show(raw_data)

    # display raw data to user 
    def goto_raw_data(self, *args):
        global raw_data
        dfgui.show(raw_data)

但这是我的问题 - 在PreviewScreen类中,访问global raw_data中的goto_raw_data完全正常,raw_data包含pandas数据帧,但在访问同一个全局变量时__init__,它仍然初始化为原始声明中的None

我的init函数中是否存在阻止全局变量填充的奇怪内容?我想的可能是编译器读取类的顺序,但除此之外,我无法想到任何事情。

有没有办法解决这个问题,以便我可以访问__init__中的全局变量,或者我坚持在定义的函数中访问。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

要完成的代码太多,但是,我可以在某种程度上复制您尝试执行的操作并且可以正常工作

raw_data = None

class IntroScreen:

 def change_raw_data_value(self):
    global raw_data
    raw_data = 'Changed raw_data once'

 def print_raw_data(self):
    print(raw_data)


class PreviewScreen:

 def __init__(self):
    global raw_data
    print(raw_data)

 def change_raw_data_value(self):
    global raw_data
    raw_data = 'Changed raw_data twice' 

 def print_raw_data(self):
    print(raw_data)

if __name__ == '__main__':
 intro_screen = IntroScreen()
 intro_screen.change_raw_data_value()
 intro_screen.print_raw_data()

 preview_screen = PreviewScreen()
 preview_screen.change_raw_data_value()
 preview_screen.print_raw_data()

Changed raw_data once
Changed raw_data once -> from Preview Screen __init__
Changed raw_data twice
[Finished in 0.2s]

答案 1 :(得分:0)

在这里回答我自己的问题。没有解决方案来修复它,因为它是程序设置的方式。屏幕初始化如下:

class OutlierDetectionApp(App):

        def build(self):
            # set window size and color
            #Window.clearcolor = (1,1,1,1)

            # initialize screen manager and create screens
            my_screenmanager = ScreenManager()
            intro_screen = IntroScreen(name='intro_screen')
            preview_screen = PreviewScreen(name='preview_screen')

            # add screens to screen manager
            my_screenmanager.add_widget(intro_screen)
            my_screenmanager.add_widget(preview_screen)
            return my_screenmanager

if __name__ == '__main__':
    OutlierDetectionApp().run()

因此,在按钮单击将PreviewScreen设置为实际文件之前,raw_data正在初始化,因此在屏幕初始化时数据仍为None。它在自定义方法中工作的原因是因为这些方法的逻辑(即:goto_raw_data)在运行时被计算,在这种情况下raw_data将被正确填充。

感谢所有想出让我得出这个结论的人!是时候重新格式化代码以解决这个问题了。