在用户定义的类的实例上启用列表(实例)或元组(实例)
问题内容:
有没有一种方法可以使用标准类型构造函数(例如int,set,dict,list,tuple等)以用户定义的方式将用户定义的类的实例强制为这些类型之一?例如
class Example:
def __init__(self):
self.a=1
self.b=2
然后有
>>> ex = Example()
>>> dict(ex)
{"a":1, "b":2}
我不知道是否可能,如果可以,我需要在类定义中添加什么。现在,我需要这个,并且实现了一个“ as_dict”方法,该方法在对象上调用,但是看起来并不自然。
问题答案:
通过添加__iter__()
方法使您的类型可迭代。琐碎地:
class Example:
def __init__(self):
self.a = 1
self.b = 2
def __iter__(self):
yield "a", self.a
yield "b", self.b
这产生了一个包含名称/值对的元组序列,dict()
很高兴使用。
dict(Example()) # {'a': 1, 'b': 2}
当然,在那里有很多重复的话题。因此,您可以改写__iter__()
以使用预定义的属性列表:
def __iter__(self):
names = "a", "b"
for name in names:
yield name, getattr(self, name)
您还可以让它对实例中的 所有 属性进行内部检查,而忽略其值可调用的属性:
def __iter__(self):
names = dir(self)
for name in names:
value = getattr(self, name)
if not callable(value):
yield name, value
还是让它从实例的__dict__
属性中产生,该实例的属性仅包含直接存储在实例上的属性(上述dir()
方法还可以找到继承的属性):
def __iter__(self):
yield from self.__dict__.items()