Изменить переменные экземпляра из другого файла? - PullRequest
0 голосов
/ 01 марта 2012

Можно ли изменить переменную экземпляра из другого файла?

Я хочу изменить переменную экземпляра внутри File_1 из File_2.

Например:

//File 1
import File_2

class Main:
    def __init__(self):
        self.example = "Unmodified"

    def modify(self):
        File_2.modify()

main = Main()
main.modify()


//File 2
import File_1

def modify():
    File_1.main.example = "Modified"

Это дает мне следующий вывод:

Traceback (most recent call last):
File "File_1.py", line 4, in <module>
  import File_2
File "File_2.py", line 3, in <module>
  import File_1
File "File_1.py", line 14, in <module>
  main.modify()
File "File_1.py", line 11, in modify
  File_2.modify()
AttributeError: 'module' object has no attribute 'modify'

Почему?

РЕДАКТИРОВАТЬ (чтобы объяснить лучше):
Экземпляр основного класса (в файле 1) имеет переменную; я хочу изменить эту переменную из другого файла (файл 2). Я немного изменил код:

//File 1
import File_2

class Main:
    def __init__(self):
        self.example = "Unmodified"

    def modify(self):
        File_2.modify()

if __name__ == "__main__":
    main = Main()
    main.modify()


//File 2
def modify():
    //do some stuff
    //now I want to modify the example variable from the main class, but how?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Ваш код полон циклического импорта, посмотрите на Python: Круговой (или циклический) импорт , чтобы понять, о чем я говорю.

В основном проблема в том, что когда компилятор приходит к этой строке:

File_2.modify()

Файл_2 загружен не полностью, что означает, что компилятор еще не прочитал строки:

def modify():
    File_1.main.example = "Modified"

Так как он был возвращен к File_1 от предыдущего:

import File_1

Кроме того, ваш код кажется довольно странным. Если вы хотите предоставить больше информации о вашем реальном коде, возможно, лучший дизайн мог бы решить вашу проблему.

Редактировать: У вас есть для удаления циклического импорта. Один из способов сделать то, что вам нужно, - передать аргумент функции File_2.modify(arg) и поработать над этим:

# File_2
# !! do NOT import File_1 in this file
def modify(obj):
    obj.value += 7

Но в вашем случае вам придется передать весь объект (self) в функцию modify, и это является пустой тратой на изменение только одного значения.

Было бы лучше сделать что-то вроде:

# File_1
import File_2
class Main:
    # ...
    def modify()
        self.value = File_2.modify(self.value)

# File_2
# !! do NOT import File_1 in this file
def modify(num):
    return num + 7

Но, опять же, это всего лишь примеры, так как вы не показываете свой реальный код, мы не можем сказать вам, что лучше в вашем случае (может быть, ни один из вышеперечисленных), или очень вам помочь.

0 голосов
/ 01 марта 2012

Что не работает в Python, так это «перекрестный импорт», который вы пытаетесь сделать - Когда вы импортируете оба файла друг в друга, у вас возникают несоответствия и нежелательные побочные эффекты. В этом случае, когда строка main.modify() запускается при разборе File_1, он находит еще не полностью инициализированный модуль «File_2» в памяти, где функция «modify» еще не существует.

Измените порядок кода, чтобы у вас не было циклического импорта, и он должен работать - Например, если файл, который вы импортируете первым - или запускаете как основной модуль, это File_1, внутри File_2, вместо импорта File_2 в первой строке, импортируйте его только внутри функции изменения, например:

#File 2


def modify():
    import File_1
    File_1.main.example = "Modified"

N.B. эти операции импорта, поскольку они ссылаются на модуль, который фактически уже импортирован в интерпретатор, просто привязывают уже загруженный объект модуля к переменной в рабочей области - другими словами, Python не будет осуществлять доступ к диску для модуля файл при каждом вызове функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...