簡體   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