繁体   English   中英

在Python中根据对象属性创建列表

[英]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

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

  • 选择一个订单并将其存储在列表中(例如,在class属性中)。 然后,您的__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM