在用户定义的类的实例上启用列表(实例)或元组(实例)


问题内容

有没有一种方法可以使用标准类型构造函数(例如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()