Доступ к метону экземпляра из функции в другом модуле - PullRequest
0 голосов
/ 04 апреля 2020

Вопрос Noob.

У меня есть следующий простой код:

class Test():

    def __init__(self):
        self.foo = "foo"

    def bar(self):
        self.foo = "bar"

def action():
    a = input("Anything>")
    spam.bar()
    print(spam.foo)

spam = Test()

action()

Он отображает, как и ожидалось, "бар".

Когда я делю его на две части файлы: test_main.py:

from test_module import action

class Test():

    def __init__(self):
        self.foo = "foo"

    def bar(self):
        self.foo = "bar"


spam = Test()

action()

и test_module.py:

def action():
    a = input("Anything>")
    spam.bar()
    print(spam.foo)

Функция action () не может получить доступ к объекту "спам":

  File "test_main.py", line 14, in <module>
    action()
  File "/home/krzysztof/Documents/dev/Python Crash Course/12/test_module.py", line 3, in action
    spam.bar()
NameError: name 'spam is not defined'

Я знаю, что такой доступ возможен, но я не могу найти информацию о том, как это сделать. Чего мне не хватает?

Ответы [ 4 ]

1 голос
/ 04 апреля 2020

Вы можете передать spam экземпляр вашего класса в вашу функцию действия в качестве параметра. И измените определение вашей функции.

test_main.py

from test_module import action 
class Test(): 
    def __init__(self): 
        self.foo = "foo" 
    def bar(self): 
        self.foo = "bar" 

spam = Test() 
action(spam)

test_module.py

def action(spam): 
    a = input("Anything>") 
    spam.bar() 
    print(spam.foo)
1 голос
/ 04 апреля 2020

Ранее вы имели доступ к spam, поскольку это была глобальная переменная в том же файле. Вы не можете получить доступ к глобальным переменным напрямую из другого файла.

Правильный способ сделать это - изменить action() на получение спама в качестве параметра:

def action(spam):
    a = input("Anything>")
    spam.bar()
    print(spam.foo)

и затем вызвать его с помощью вместо этого используйте action(spam).

0 голосов
/ 04 апреля 2020

при импорте файла тестового модуля перед импортом запускается весь код из этого файла. Таким образом, переменная спама не существует в файле test_module. вам лучше использовать спам в качестве аргумента в функции действия.

0 голосов
/ 04 апреля 2020

Вы можете использовать

from test_main import bar

, и вы можете использовать что-то вроде этого формата

from FOLDER_NAME import FILENAME
from FILENAME import CLASS_NAME FUNCTION_NAME
...