如何使用来自具有主要Funciton的另一个程序导入的



我正在尝试更好地组织我的程序,并决定将导入到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_dirDirectorySetup类的对象具有此属性。因此,如果要访问此属性,则必须先创建一个对象。

例如:

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

访问它

相关内容

  • 没有找到相关文章

最新更新