我正在尝试更好地组织我的程序,并决定将导入到Final.py中的小文件。
在这里,我希望DirectorySetup在Main的开头启动。我希望能够调用目录。
这是我尝试的:
class DirectorySetup:
'''The directory paths for the program'''
def __init__(self):
self.cwd = os.getcwd()
self.Raw_data_dir= self.cwd + 'Raw_data'
self.Clean_data_dir= self.cwd + 'Clean_data'
self.table_dir= self.cwd + 'Tables'
def main(): # Define the main function
#the class with the directory
Directory= DirectorySetup()
os.chdir(Directory.table_dir)
###does other things that I removed for clarity ###
if __name__ == "__main__":
main()
然后我在我的final.py程序中运行它:
import INIT_SCTFT
import os
first=INIT_SCTFT
first.main()
first.DirectorySetup.Clean_data_dir
给我错误
first.DirectorySetup.Clean_data_dir
AttributeError: type object 'DirectorySetup' has no attribute 'Clean_data_dir'
如何获得main((保存DirectorySetup?
注意:
您是导入模块INIT_SCTFT
,然后将first
分配给此模块。现在首先是一个模块(您可以通过打印类型(首先(检查。 first.main()
将从INIT_SCTFT
执行主函数。主要要做的就是创建一个对象并更改电流DIR。然后结束。
然后first.DirectorySetup.Clean_data_dir
尝试从类DirectorySetup
调用Clean_data_dir
。但是DirectorySetup
类并未定义Clean_data_dir
!DirectorySetup
类的对象具有此属性。因此,如果要访问此属性,则必须先创建一个对象。
例如:
obj = first.DirectorySetup()
obj.Clean_data_dir
编辑:
从评论中回答您的问题。这取决于您要实现的目标。对于exapmle,您可以创建一些将返回对象列表的方法。
class DirectorySetup:
'''The directory paths for the program'''
def __init__(self):
self.cwd = os.getcwd()
self.Raw_data_dir= self.cwd + 'Raw_data'
self.Clean_data_dir= self.cwd + 'Clean_data'
self.table_dir= self.cwd + 'Tables'
def create_objects():
one = DirectorySetup()
two = DirectorySetup()
three = DirectorySetup()
return one, two, three
然后在Final.py中您可以创建对象列表:objects = first.create_objects()
或您提到的
class my_objects:
one = DirectorySetup()
two = DirectorySetup()
three = DirectorySetup()
然后在final.py中您访问它:first.my_objects.one
。另请注意,如果您决定将对象放入INIT:
class my_objects:
def __init__():
one = DirectorySetup()
two = DirectorySetup()
three = DirectorySetup()
然后,首先您需要创建此类的对象才能访问这些变量obj = first.my_objects()
,然后您可以使用它: obj.one
。
您的问题是python是垃圾收集您的DirectorySetup实例。
最简单的解决方案是要获得主要解决方案,只需返回DirectorySetup实例的引用,因此您可以访问它:
def main(): # Define the main function
#the class with the directory
Directory= DirectorySetup()
os.chdir(Directory.table_dir)
return Directory
###does other things that I removed for clarity ###
然后,您只需将您的最终脚本更改为:
import INIT_SCTFT
import os
first=INIT_SCTFT
directory = first.main()
directory.Clean_data_dir
您如何从MAIN中进行操作?
directoryfile.py
class DirectorySetup:
'''The directory paths for the program'''
def __init__(self):
self.cwd = os.getcwd()
self.Raw_data_dir= self.cwd + 'Raw_data'
self.Clean_data_dir= self.cwd + 'Clean_data'
self.table_dir= self.cwd + 'Tables'
#the class with the directory
Directory= DirectorySetup()
os.chdir(Directory.table_dir)
然后从final.py
Directory
对象 from DirectoryFile import Directory
#access variable Directory's member
print(Directory.Clean_data_dir)
当 init ((添加属性时,属性会在实例化时发生。
。编辑:关于第二个想法,您可以从main((中创建一个全局变量,该变量可能会这样:
Directory = None
def main():
global Directory
Directory= DirectorySetup()
然后从final.py