在Python中创建对象属性列表
这里有一个非常简单的问题。创建ben后,我是否可以调用ben[0]来调用name,调用ben[1]来调用age 我想知道是否有办法以列表的形式访问这些属性在Python中创建对象属性列表,python,Python,这里有一个非常简单的问题。创建ben后,我是否可以调用ben[0]来调用name,调用ben[1]来调用age 我想知道是否有办法以列表的形式访问这些属性 class People(): def __init__(self, name, age): ben=People("ben", "10") 在这里 >>> b = People("ben",10) >>> b[0] 'ben' >>> b[1] 10 >>>
class People():
def __init__(self, name, age):
ben=People("ben", "10")
在这里
>>> 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']
听起来你想建立一个: 如果您想在类中获得除属性之外的其他功能,可以直接从
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'
您想对类做什么是不可能的,因为它的属性没有固有的顺序,因为它们存储在dict中,所以没有合理的方法将
ben[0]
映射到ben.name
而不是ben.age
但您可以通过几种不同的方式修改该类以使其合理:
- 选择一个订单并将其存储在列表中(例如,在类属性中)。然后,您的
只需调用\uu getitem\uuu
getattr(self,self.\u字段[index])
- 选择可以通过编程方式定义的顺序(例如,排序顺序)
- 使用元类使类将其属性存储在
中,在这种情况下,您在OrderedDict
中分配属性的顺序就是它们的顺序。所以它就是self.\uu dict\uu.values()[index]\uuuu init\uuuu
- 使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
如果查看的源代码,可以看到它使用了以下组合:有一个名为
\u fields
的类属性来存储字段名,而字段值存储在它继承的元组中,然后,它将\uuuu dict\uuuu
定义为一个@属性
,将它们动态地组合在一起。这可能比你需要的聪明得多。而且,如果你真的需要这么聪明,首先就使用或继承一个namedtuple
。这完全取决于你的类定义和init方法的其余部分……使用属性ben.name
和ben.age
更符合逻辑。如果你坚持使用索引,你应该在类上实现。@Ben:没有多少10岁的孩子有数千个代表点;干得好。:)当您使用方括号访问它时,不会调用任何\uuuu getitem\uuuu
<代码>初始化创建一个列表
>>> import collections
>>> People = collections.namedtuple('People', 'name age')
>>> ben = People("ben", 10)
>>> ben.name
'ben'
>>> ben[0]
'ben'
>>> 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'