python:使 class 对象可迭代
python: make a class object iterable
这是我正在尝试做的事情:
我创建了一个类方法,如果没有将参数添加到此方法,则 returns 要么是 dict
的对象,要么是如果添加了任何参数,则由字典列表组成的对象,如下代码所示:
@classmethod
def make_attr(cls, **kwargs):
"""
code: do something, generate either a tuple
"""
if :
data = {}
"""
add k, v in data
"""
return cls(**data)
else:
data = []
for k, v in kwargs.items():
_d = {}
_d[k] = v
data.append(_d)
return cls(*data)
代码如上,我遇到的问题是如果dict的类方法returns对象,我可以使用object.attr
来获取它的值,但是如果列表的类方法returns对象,我发现没有办法解压它或获取它的属性或值,例如:
>> result = Class.make_attr(login_name="test")
>> print("age: ", result.age)
>> age: 25
>> result = Class.make_attr()
>> print(result)
>> <model._class.Class object at 0x104020358>
>> for i in result:
>> print(i)
>> TypeError: 'Class' object is not iterable
那么,我怎样才能使这个对象可迭代?
我终于找到了解决问题的方法,在我的 class:
中添加了 built-in 方法
class Class:
def __init__(self, *args, **kwargs):
self.start = 0
self.end = args
def __iter__(self):
return self
def __next__(self):
if self.start >= len(self.end):
raise StopIteration
else:
self.start += 1
return self.end[self.start-1]
再次感谢@ducminh
这是我正在尝试做的事情:
我创建了一个类方法,如果没有将参数添加到此方法,则 returns 要么是 dict
的对象,要么是如果添加了任何参数,则由字典列表组成的对象,如下代码所示:
@classmethod
def make_attr(cls, **kwargs):
"""
code: do something, generate either a tuple
"""
if :
data = {}
"""
add k, v in data
"""
return cls(**data)
else:
data = []
for k, v in kwargs.items():
_d = {}
_d[k] = v
data.append(_d)
return cls(*data)
代码如上,我遇到的问题是如果dict的类方法returns对象,我可以使用object.attr
来获取它的值,但是如果列表的类方法returns对象,我发现没有办法解压它或获取它的属性或值,例如:
>> result = Class.make_attr(login_name="test")
>> print("age: ", result.age)
>> age: 25
>> result = Class.make_attr()
>> print(result)
>> <model._class.Class object at 0x104020358>
>> for i in result:
>> print(i)
>> TypeError: 'Class' object is not iterable
那么,我怎样才能使这个对象可迭代?
我终于找到了解决问题的方法,在我的 class:
中添加了 built-in 方法class Class:
def __init__(self, *args, **kwargs):
self.start = 0
self.end = args
def __iter__(self):
return self
def __next__(self):
if self.start >= len(self.end):
raise StopIteration
else:
self.start += 1
return self.end[self.start-1]
再次感谢@ducminh