运行 脚本时出现 NameError
NameError when running script
虽然 运行 这个脚本我收到以下错误。
p1=Person1("Plumber",fav_food,ethnicity,name,"male")
NameError: name 'fav_food' is not defined
我是 OOP 的新手,但据我了解,fav_food
是在我定义 Person1
class 时定义的。显然我错了,但为什么?
class Person():
def __init__(self,job,fav_food,ethnicity,name,gender):
self.job=job
self.fav_food=fav_food
self.ethnicity=ethnicity
self.name=name
self.gender=gender
class Person1(Person):
def __init__(self,job,fav_food,ethnicity,name,gender):
Person.__init__(self,job,fav_food,ethnicity,name,gender)
self.job=job
self.fav_food="chips"
self.ethnicity="white"
self.name=random.shuffle(names)[0]
self.gender=gender
p1=Person1("Plumber",fav_food,ethnicity,name,"male")
fav_food
在 __init__
中本地定义,并且由于其在 __init__
中的唯一分配而在未来的实例命名空间中定义。它未在您尝试使用 fav_food
创建 Person1
实例的模块命名空间中定义,因此出现错误。
Python 使用 LEGB 规则进行变量名解析。它从 L 到 B 搜索,从名称出现的级别开始。该名称解析为找到的第一个名称定义。如果未找到名称定义,则会出现 NameError。
L - Local: first 它在局部范围内查找变量定义函数
E - Enclosing: next 它在任何封闭函数的范围内查找
G - Global: then 它在模块级别查找变量定义.在代码中 fav_food
在模块范围内被引用,因此 Python 需要在模块级别或更高级别定义 fav_food
B - 内置: 最后 Python 寻找内置-在变量定义中
除了LEGB名称解析外,还有object.attribute解析。在这种情况下,fav_food
将在 person 实例中定义:person.fav_food
从 Person1.__init__
中删除所有不必要的参数:
class Person():
def __init__(self, job,fav_food,ethnicity,name,gender):
self.job=job
self.fav_food=fav_food
self.ethnicity=ethnicity
self.name=name
self.gender=gender
class Person1(Person):
def __init__(self,job,gender):
Person.__init__(self,job,"chips","white",random.shuffle(names)[0],gender)
p1=Person1("Plumber", "male")
虽然 运行 这个脚本我收到以下错误。
p1=Person1("Plumber",fav_food,ethnicity,name,"male")
NameError: name 'fav_food' is not defined
我是 OOP 的新手,但据我了解,fav_food
是在我定义 Person1
class 时定义的。显然我错了,但为什么?
class Person():
def __init__(self,job,fav_food,ethnicity,name,gender):
self.job=job
self.fav_food=fav_food
self.ethnicity=ethnicity
self.name=name
self.gender=gender
class Person1(Person):
def __init__(self,job,fav_food,ethnicity,name,gender):
Person.__init__(self,job,fav_food,ethnicity,name,gender)
self.job=job
self.fav_food="chips"
self.ethnicity="white"
self.name=random.shuffle(names)[0]
self.gender=gender
p1=Person1("Plumber",fav_food,ethnicity,name,"male")
fav_food
在 __init__
中本地定义,并且由于其在 __init__
中的唯一分配而在未来的实例命名空间中定义。它未在您尝试使用 fav_food
创建 Person1
实例的模块命名空间中定义,因此出现错误。
Python 使用 LEGB 规则进行变量名解析。它从 L 到 B 搜索,从名称出现的级别开始。该名称解析为找到的第一个名称定义。如果未找到名称定义,则会出现 NameError。
L - Local: first 它在局部范围内查找变量定义函数
E - Enclosing: next 它在任何封闭函数的范围内查找
G - Global: then 它在模块级别查找变量定义.在代码中 fav_food
在模块范围内被引用,因此 Python 需要在模块级别或更高级别定义 fav_food
B - 内置: 最后 Python 寻找内置-在变量定义中
除了LEGB名称解析外,还有object.attribute解析。在这种情况下,fav_food
将在 person 实例中定义:person.fav_food
从 Person1.__init__
中删除所有不必要的参数:
class Person():
def __init__(self, job,fav_food,ethnicity,name,gender):
self.job=job
self.fav_food=fav_food
self.ethnicity=ethnicity
self.name=name
self.gender=gender
class Person1(Person):
def __init__(self,job,gender):
Person.__init__(self,job,"chips","white",random.shuffle(names)[0],gender)
p1=Person1("Plumber", "male")