这是我的代码:
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'
你能告诉我哪里出错了吗?
答案 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),因为这会引发错误。