有没有办法启用使用标准类型构造函数(例如 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”方法,但它看起来并不自然。
通过添加__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)