0

这里真的很简单的问题。创建 ben 后,无论如何我可以调用 ben[0] 调用 name 和 ben[1] 调用 age 吗?

我想知道是否有办法将这些属性作为列表访问。

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

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

3 回答 3

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'
于 2013-10-25T22:07:35.317 回答
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']
于 2013-10-25T21:51:07.180 回答
1

你想对你的类做什么是不可能的,因为它的属性没有固有的顺序,因为它们存储在一个字典中,所以没有合理的方法来映射ben[0]toben.name而不是 to ben.age

但是您可以通过几种不同的方式修改该类以使其合理:

  • 选择一个订单并将其存储在一个列表中(例如,在一个类属性中)。然后,您__getitem__只需调用getattr(self, self._fields[index]).
  • 选择一个您可以通过程序定义的顺序(例如,排序顺序)。
  • 使用元类使您的类将其属性存储在 中OrderedDict,在这种情况下,您分配它们__init__的顺序就是它们的顺序。所以它只是self.__dict__.values()[index]
  • 使用__slots__而不是 dict 作为您的属性。

如果您查看 的源代码collections.namedtuple,您会发现它使用了这些的组合:有一个名为的类属性_fields用于存储字段名称,而字段值存储在它继承的元组中,然后它定义__dict__@property这将它们放在一起并OrderedDict在飞行中。这可能比你需要的聪明得多。而且,如果您确实需要如此聪明,只需namedtuple首先使用或继承 a 即可。

于 2013-10-25T22:16:52.153 回答