2024-09-30 08:14:53 发布
网友
如何迭代对象并将其所有属性分配给列表
从
a = [] class A(object): def __init__(self): self.myinstatt1 = 'one' self.myinstatt2 = 'two'
至
a =['one','two']
一种方法是通过实现部分或全部container API,使类的行为类似于list。根据您使用的外部API的工作方式,您可能只需要实现__iter__。如果它需要更多,您可以随时传递它list(a),它将使用迭代器构建一个列表。你知道吗
list
__iter__
list(a)
下面是一个添加__iter__方法的简单示例:
class A(object): def __init__(self): self.myAttr1 = "one" self.myAttr2 = "two" def __iter__(self): yield self.myAttr1 yield self.myAttr2
如果您只想存储一堆属性并返回一个列表以便您的API可以使用它,那么不要创建一个完整的类。改用^{}。下面是一个例子。你知道吗
>>> import collections >>> Point = collections.namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p Point(x=1, y=2)
如果您的API只需要一个序列(不是特别的list),那么您可以直接传递p。如果它特别需要一个列表,那么将Point对象转换成一个列表就很简单了。你知道吗
p
Point
>>> list(p) [1, 2]
您甚至可以对新创建的Point类进行子类化,并添加更多方法(文档中有详细信息)。如果namedtuple不能满足您的需要,请考虑对^{}抽象基类进行子分类或将其用作mixin。你知道吗
namedtuple
一种方法是通过实现部分或全部container API,使类的行为类似于
list
。根据您使用的外部API的工作方式,您可能只需要实现__iter__
。如果它需要更多,您可以随时传递它list(a)
,它将使用迭代器构建一个列表。你知道吗下面是一个添加
__iter__
方法的简单示例:如果您只想存储一堆属性并返回一个列表以便您的API可以使用它,那么不要创建一个完整的类。改用^{} 。下面是一个例子。你知道吗
如果您的API只需要一个序列(不是特别的
list
),那么您可以直接传递p
。如果它特别需要一个列表,那么将Point
对象转换成一个列表就很简单了。你知道吗您甚至可以对新创建的} 抽象基类进行子分类或将其用作mixin。你知道吗
Point
类进行子类化,并添加更多方法(文档中有详细信息)。如果namedtuple
不能满足您的需要,请考虑对^{相关问题 更多 >
编程相关推荐