2015-05-03 81 views
0

運行此腳本時,我收到以下錯誤。運行腳本時NameError

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

我是新來OOP,但是,我的理解是,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

抱歉,不確定你的意思 - 我認爲通過在Person1類中定義self.fav_food,我不必在其他地方定義它 – 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__其唯一的任務定義。它未在您嘗試使用fav_food創建Person1實例的模塊命名空間中定義,因此是錯誤。

Python使用LEGB規則進行變量名稱解析。它從L到B進行搜索,從名稱出現的級別開始。該名稱解析爲找到的第一個名稱定義。如果未找到名稱定義,則會發生NameError。

大號 - 本地第一它看起來變量定義在功能

Ë局部範圍內 - 內附下一個它看起來在所有的封閉功能範圍

G - Global然後它在模塊級別查找變量定義。在代碼fav_food在模塊範圍內引用,所以Python需要在模塊級別的fav_food定義或更高

- 內置最後 Python將內置變量定義

除了LEGB名稱解析之外,還有object.attribute解析。在這種情況下fav_food將親自情況下被定義爲:person.fav_food