2013-10-25 49 views
0

這裏真的很簡單的問題。在ben創建之後,無論如何,我可以調用ben [0]來調用name和ben [1]來調用年齡嗎?在Python中創建對象屬性列表

我想知道是否有一種方法來作爲列表訪問這些屬性。

class People(): 
    def __init__(self, name, age): 

ben=People("ben", "10") 
+0

這完全取決於你的類定義和init方法的其餘部分所說的內容...... – Ben

+3

使用屬性'ben.name'和'ben.age'更合乎邏輯。如果你堅持使用索引,你應該在類上實現['__getitem__'](http://docs.python.org/2/reference/datamodel.html#special-method-names)。 –

+0

// @本:很多10歲的孩子有數千個重點;不錯的工作。 :) – abarnert

回答

4
class People(object):  
    def __init__(self,name,age): 
     self.stuff = [name,age] 
    def __getitem__(self, arg): 
     return self.stuff[arg] 

這裏是

>>> b = People("ben",10) 
>>> b[0] 
'ben' 
>>> b[1] 
10 
>>> 

你也可以做類似

class People(object):  
    def __init__(self,name,age): 
     self.stuff = {'name':name,'age':age} 
    def __getitem__(self, arg): 
     return self.stuff[arg] 

b = People("asd",10) 
b['age'] 
b['name'] 
+0

這很整齊。 –

+0

酷,所以__getitem__創建一個列表? – stephan

+2

當你使用方括號來訪問它時,不會調用__getitem__' ...'__init__'創建一個列表 –

5

這聽起來像你試圖建立一個namedtuple

>>> import collections 
>>> People = collections.namedtuple('People', 'name age') 
>>> ben = People("ben", 10) 
>>> ben.name 
'ben' 
>>> ben[0] 
'ben' 

如果你想在你的類的附加功能,而不是僅僅有屬性,你可以從namedtuple繼承,而不是直接使用它:

>>> class People(collections.namedtuple('People', 'name age')): 
...  def __str__(self): 
...   return self.name.title() + '!' 
>>> ben = People("ben", 10) 
>>> print(ben) 
Ben! 
>>> ben 
People(name='ben', age=10) 
>>> ben.name 
'ben' 
>>> ben[0] 
'ben' 
1

你想與你的類做什麼是不可能的,因爲它的屬性沒有固有的順序,因爲它們存儲在一個字典中,所以沒有合理的方法將ben[0]映射到ben.name而不是ben.age

但是你可以在幾種不同的方式,使之合理修改類:

  • 選擇一個訂單並將其存儲在一個列表中(例如,在一個類的屬性)。然後,你的__getitem__只需撥打getattr(self, self._fields[index])
  • 選擇一個您可以通過編程定義的訂單(例如排序順序)。
  • 使用元類使您的類在OrderedDict中存儲其屬性,在這種情況下,您在__init__中分配它們的順序是它們的順序。所以這只是self.__dict__.values()[index]。使用__slots__代替您的屬性字典。

如果你看看源collections.namedtuple,你可以看到它使用這些方法的組合:有一個名爲_fields存儲字段名稱類屬性,而本場值存儲在其繼承的元組從,然後它將__dict__定義爲@property,它們將它們放在一起即爲OrderedDict。這可能比你想要的要聰明得多。而且,如果你需要這個聰明的,只是首先使用或繼承namedtuple

相關問題