2017-02-01 14 views
0

我想創建一個包含一個類的實例的列表,並以數字初始化0到9這是我做的:初始化類的幾個實例列表內與迭代指數

class Element(object): 
    def __init__(self, elem_index=None): 
     if elem_index: 
      self._elem_index = elem_index 
    def get_index(self): 
     return self._elem_index 

elements = [Element(elem_index=i) for i in range(10)] 

print(elements[0].get_index()) 

這裏的錯誤我得到:

AttributeError: 'Element' object has no attribute '_elem_index' 
+0

如果'elem_index'爲'None'(或其他一些錯誤值),那麼'self._elem_index'應該是什麼? – chepner

+0

你並不總是創建'_elem_index'因此你不能依賴它總是在那裏。 –

回答

4

根據您在初始化過程中傳遞參數elem_index的truthness正在有條件地設置_elem_index爲您的實例的屬性。

對於i == 0,通過range(10)產生的第一值,該屬性將不會被設置,因爲0False在您的條件進行評估時。因此,嘗試查找時會失敗。

在你的條件明確:

if elem_index is not None: 
    self._elem_index = elem_index 
+0

即使調用者沒有提供任何值,將'self._elem_index'設置爲* some value *也可能是一個好主意。檢查具有虛擬值的屬性(如「None」)比檢查它是否存在要容易和方便。 – Blckknght

0

看在你__init__功能的代碼更接近:

if elem_index: 
    self._elem_index = elem_index 

你講的翻譯什麼的英語,如果elem_index布爾值如果爲true,則爲此類實例提供一個名爲_elem_index的屬性。否則,跳過此代碼並從不定義_elem_index

隨着仍然記住,理解,默認第一個值range()產生爲零

>>> list(range(1)) 
[0] 
>>> 

而在蟒蛇零計算爲False

>>> bool(0) 
False 
>>> 

這意味着當您試圖調用get_index()上在elements中的第一個值,Python引發錯誤,因爲您的條件在__init__失敗。

要解決此問題,您需要更具體,並且告訴Python您何時想跳過_elem_index的定義。而不是做if elem_index,使用這個is not運算符測試明確地測試elem_index是否不等於None; if elem_index is not None。例如:

>>> var = 0 
>>> if var: 
    print("This will not run because zero evalutes to false") 


>>> if var is not None: 
    print("This will run because were testing if var is equal to None") 


This will run because were testing if var is equal to None 
>>>