Python - NameError при импорте модуля класса - PullRequest
0 голосов
/ 14 января 2020

Я получаю следующую ошибку при запуске моего скрипта:
NameError: имя 'curr_period_2' не определено

Я не слишком много использовал классы, и это Впервые у меня они были в отдельном модуле.

Я пытаюсь просто изменить один атрибут объекта с помощью функции change_object.

Не учитывайте, что делает код, так как это всего лишь небольшой тест.

Любая помощь очень ценится.

MyClass.py

class MyPeriod:

def __init__(self, year, month):
    self._year = year
    self._month = month

@property
def year(self):
    return self._year


@year.setter
def year(self, year):
    self._year = year

MyMain.py

    from MyClass import MyPeriod

    def main():
        curr_period = MyPeriod(2028, 1)
        print(f'Object 1 is {curr_period.year}-{curr_period._month}')
        curr_period.year = curr_period.year + 1
        print(f'Object 1 +1  is {curr_period.year}-{curr_period._month}')

    def init_object():
        curr_period_2 = MyPeriod(2038, 1)
        print((f'Object 2 is {curr_period_2.year}-{curr_period_2._month}'))

    def change_object():
        curr_period_2.year = curr_period_2.year * 2
        print(f'Object " * 2' is {curr_period_2.year}-{curr_period_2._month})

    init_object()
    change_object()

    if __name__ == "__main__":
        main()

Ответы [ 2 ]

0 голосов
/ 23 января 2020

main (), init_object () и change_object () являются «одними / локальными / независимыми» функциями, поэтому переменные внутри, кроме локальных (не глобальных).

Я думаю, лучший способ решить эту проблему , объявляет эти внутренние переменные как Global внутри этих функций.

см .:

from MyClass import MyPeriod

def main():
    # first of all declare curr_period as global
    global curr_period

    curr_period = MyPeriod(2028, 1)
    print(f'Object 1 is {curr_period.year}-{curr_period._month}')
    curr_period.year = curr_period.year + 1
    print(f'Object 1 +1  is {curr_period.year}-{curr_period._month}')

def init_object():
    #same here "Global" declaration
    global curr_period_2

    curr_period_2 = MyPeriod(2038, 1)
    print((f'Object 2 is {curr_period_2.year}-{curr_period_2._month}'))

def change_object():
    curr_period_2.year = curr_period_2.year * 2
    print(f'Object " * 2' is {curr_period_2.year}-{curr_period_2._month})

init_object()
change_object()

if __name__ == "__main__":
    main()
0 голосов
/ 14 января 2020

curr_period_2 не существует в change_object, поскольку это локальная переменная для функции init_object. Вы можете попробовать передать его в качестве параметра в change_object функцию:

def init_object():
    curr_period_2 = MyPeriod(2038, 1)
    print((f'Object 2 is {curr_period_2.year}-{curr_period_2._month}'))
    return curr_period_2

def change_object(current_period_2):
    curr_period_2.year = curr_period_2.year * 2
    print(f'Object " * 2' is {curr_period_2.year}-{curr_period_2._month})

затем:

period = init_object()
change_object(current_period_2=period)

Или попробуйте использовать global variable

...