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

Pat*_*lva 2 python

有没有办法启用使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义的类的实例强制为这些类型之一?例如

class Example:
    def __init__(self):
        self.a=1
        self.b=2
Run Code Online (Sandbox Code Playgroud)

然后有

>>> ex = Example()
>>> dict(ex)
{"a":1, "b":2}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否可能,如果可能,我需要在类定义中添加什么。现在我需要这个,我实现了一个我在对象上调用的“as_dict”方法,但它看起来并不自然。

kin*_*all 6

通过添加__iter__()方法使您的类型可迭代。琐碎:

class Example:

    def __init__(self):
        self.a = 1
        self.b = 2

    def __iter__(self):
        yield "a", self.a
        yield "b", self.b
Run Code Online (Sandbox Code Playgroud)

这会产生一个包含名称/值对的元组序列,它dict()很乐意使用。

dict(Example())    # {'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

当然,里面有很多重复的内容。因此,您可以改为编写__iter__()使用预定义的属性列表:

def __iter__(self):
    names = "a", "b"
    for name in names:
        yield name, getattr(self, name)
Run Code Online (Sandbox Code Playgroud)

您还可以让它内省实例中的所有属性,省略其值可调用的属性:

def __iter__(self):
    names = dir(self)
    for name in names:
        value = getattr(self, name)
        if not callable(value):
             yield name, value
Run Code Online (Sandbox Code Playgroud)

或者让它从实例的__dict__属性中产生,它只包含直接存储在实例上的属性(dir()上面的方法也找到了继承的属性):

def __iter__(self):
    yield from self.__dict__.items()
Run Code Online (Sandbox Code Playgroud)