运行 脚本时出现 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")