2015-05-03 3 views
0

При запуске этого скрипта я получаю следующую ошибку.NameError при запуске скрипта

p1=Person1("Plumber",fav_food,ethnicity,name,"male") 
NameError: name 'fav_food' is not defined 

Я новичок в ООП, но, как я понимаю, fav_food это определить, когда я определил Person1 класс. Очевидно, я ошибаюсь, но почему?

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") 
+1

и где вы определяете 'fav_food' на уровне модуля? – Daniel

+0

Извините, не зная, что вы имеете в виду, - подумал я, определив self.fav_food в классе Person1, мне не нужно было определять его в другом месте. – ThePrinceofPython

+0

Существуют разные пространства имен, глобальные и локальные. 'fav_food' определяется локально только в' __init__'. – Daniel

ответ

2

удалить все ненужные аргументы из 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") 
0

fav_food определяется локально в __init__ и в будущих пространствах имен экземпляра из-за его единственного назначения в __init__. Он не определен в пространстве имен модулей, в котором вы пытаетесь создать экземпляр Person1 с использованием fav_food, следовательно, ошибка.

Python использует правило LEGB для разрешения имен переменных. Он выполняет поиск от L до B, начиная с уровня, на котором происходит это имя. Имя разрешает определение первого имени. Возникновение NameError возникает, если определение имени не найдено.

л - Местного: первого он ищет определения переменных в локальной области видимости функций

E - вшит: следующих это выглядит в рамках любых функций, вмещающих

G - Глобальный: затем он ищет определение переменной на уровне модуля. В коде fav_food упоминается в рамках модуля, так что Python требует определения fav_food на уровне модуля или выше

B - Встроенный: наконец Python ищет встроенные определения переменных

В дополнение к разрешению имен LEGB, есть также object.attribute resolution. В этом случае fav_food будет определяться в случаях лица: person.fav_food

Смежные вопросы