我正在尝试更好地组织程序,并决定将一些小文件导入到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?
答案 0 :(得分:0)
您如何做到这一点呢?
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)
,然后从Directory
访问final.py
对象
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
答案 1 :(得分:0)
您的问题是,在调用main函数之后,python会在垃圾回收DirectorySetup实例。
最简单的解决方案是让main仅返回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 ###
然后,您只需将final.py脚本更改为:
import INIT_SCTFT
import os
first=INIT_SCTFT
directory = first.main()
directory.Clean_data_dir
答案 2 :(得分:0)
注意:
您要导入模块INIT_SCTFT
,然后将first
分配给该模块。
现在第一个是模块(您可以通过打印类型(第一个)进行检查。
first.main()
将执行INIT_SCTFT
中的主要功能。主要要做的就是创建一个对象并更改当前目录。然后结束。
然后first.DirectorySetup.Clean_data_dir
尝试从类Clean_data_dir
调用DirectorySetup
。但是类DirectorySetup
尚未定义Clean_data_dir
!类DirectorySetup
的对象具有此属性。因此,如果要访问此属性,则必须首先创建一个对象。
例如:
obj = first.DirectorySetup()
obj.Clean_data_dir
编辑:
通过评论回答您的问题。这取决于您要实现的目标。例如,您可以创建一些将返回对象列表的方法。
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
。