如何在Python中的不同类中使用变量?

时间:2016-08-01 11:45:12

标签: python class

这是我的代码:

class ProjectApp(tk.Tk):  

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.filepaths = []

class StartPage(tk.Frame):

    def __init__(self, parent, controller, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.controller = controller
        self.parent = parent

    def get_file(self):

        filepath = askopenfilename()

        if filepath:
            print(ProjectApp.filepaths)
            self.parent.filepaths.append(filepath)

我正在尝试在另一个类中使用filepath,但我收到了以下错误。

AttributeError: type object 'ProjectApp' has no attribute 'filepaths'

你能告诉我哪里出错了吗?

3 个答案:

答案 0 :(得分:2)

您需要创建ProjectApp的实例

myProjectApp = ProjectApp() 

然后您就可以调用属性filepaths

print(myProjectApp.filepaths)

答案 1 :(得分:2)

这取决于你想要什么。对象有两种属性: class属性和instance属性。

类属性

class属性与类的每个实例都是相同的对象。

class MyClass:
    class_attribute = []

此处MyClass.class_attribute已经为类定义,您可以使用它。如果您创建MyClass的实例,则每个实例都可以访问相同的class_attribute

实例属性

实例属性仅在创建实例时可用,并且对于类的每个实例都是唯一的。您只能在实例上使用它们。方法__init__中定义了

class MyClass:
    def __init__(self)
        self.instance-attribute = []

在您的情况下,filepaths被定义为实例属性。 您可以为此更改课程,print(ProjectApp.filepaths)将有效。

class ProjectApp(tk.Tk):  
    filepaths = []

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

如果您需要更多解释,我建议您阅读this部分python文档

答案 2 :(得分:1)

filepaths是一个实例属性。即只有在通过构造函数调用(= init )实例化ProjectApp之后,才存在filepath。

实例化StartPage时,你应该这样做:

app = ProjectApp() # her you create the ProjectApp instance with filepaths
start_page = StartPage(app, ....)

并删除print(ProjectApp.filepaths),因为这会引发错误。