gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:51:09 27 4
gpt4 key购买 nike

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

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

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()

关于python - 在用户定义类的实例上启用列表(实例)或元组(实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60346069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com