[英]Creating a list out of object attributes in Python
這里真的很簡單。 創建了ben之后,是否仍然可以調用ben [0]來調用名稱,並調用ben [1]來調用age?
我想知道是否有一種方法可以訪問這些屬性作為列表。
class People():
def __init__(self, name, age):
ben=People("ben", "10")
聽起來您正在嘗試構建一個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'
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']
您想要對類進行的操作是不可能的,因為其屬性沒有固有的順序,因為它們存儲在dict中,因此沒有合理的方法將ben[0]
映射到ben.name
而不是ben.age
。
但是您可以通過幾種不同的方法來修改類,以使其合理:
__getitem__
只是調用getattr(self, self._fields[index])
。 OrderedDict
,在這種情況下,您在__init__
分配它們的順序就是它們的順序。 所以這只是self.__dict__.values()[index]
。 __slots__
代替dict作為屬性。 如果您查看collections.namedtuple
的源代碼,您會發現它使用了以下兩種方法的組合:有一個名為_fields
的類屬性用於存儲字段名稱,而字段值則存儲在其繼承的元組中,並且然后將__dict__
定義為@property
,將它們動態組合在一起形成OrderedDict
。 這可能比您需要的要聰明得多。 而且,如果您確實需要變得聰明,則首先使用或從namedtuple
繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.