Python - 导入 class 模块时出现 NameError
Python - NameError when import class module
当我 运行 我的脚本时出现以下错误:
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()
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 变量
main()、init_object() 和 change_object() 是 "alone/local/independent" 函数,所以里面的变量只是局部的(不是全局的)。
我认为解决此问题的最佳方法是在这些函数内将这些内部变量声明为全局变量。
见:
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()
当我 运行 我的脚本时出现以下错误:
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()
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 变量
main()、init_object() 和 change_object() 是 "alone/local/independent" 函数,所以里面的变量只是局部的(不是全局的)。
我认为解决此问题的最佳方法是在这些函数内将这些内部变量声明为全局变量。
见:
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()