[英]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
。
但是您可以通过几种不同的方法来修改类,以使其合理:
__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.