Как использовать импортированные из другой программы, которая имеет основную функцию? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь организовать свою программу лучше, и решил иметь небольшие файлы, которые импортируются в 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 голосов
/ 14 мая 2019

Ваша проблема в том, что python собирает ваш экземпляр DirectorySetup после того, как была вызвана функция main.

Самое простое решение - заставить 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
0 голосов
/ 14 мая 2019

Примечание:

Вы импортируете модуль 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()

Тогда сначала вам нужно будет создать объект этого класса, чтобы получить доступ к нему.ose переменные obj = first.my_objects(), тогда вы можете использовать его: obj.one.

0 голосов
/ 14 мая 2019

Как насчет того, чтобы сделать это из основного?

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

...