Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中创建对象属性列表_Python - Fatal编程技术网

在Python中创建对象属性列表

在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 >>>

这里有一个非常简单的问题。创建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(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
    中,在这种情况下,您在
    \uuuu init\uuuu
    中分配属性的顺序就是它们的顺序。所以它就是self.\uu dict\uu.values()[index]
  • 使用
    \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'