在Python中用对象属性创建列表

时间:2013-10-25 21:45:59

标签: python

这里真的很简单。在ben创建之后,无论如何我可以调用ben [0]来呼叫姓名和ben [1]来呼叫年龄吗?

我想知道是否有办法以列表的形式访问这些属性。

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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']

答案 2 :(得分:1)

你想要对你的班级做什么是不可能的,因为它的属性没有固有的顺序,因为它们存储在一个字典中,因此没有合理的方法将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