如何使用从另一个具有主要功能的程序中导入的内容?

时间:2019-05-14 11:41:09

标签: python class import main

我正在尝试更好地组织程序,并决定将一些小文件导入到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?

3 个答案:

答案 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