【发布时间】:2018-03-19 12:17:58
【问题描述】:
我正在尝试在 Python 中创建类似 dict 的类。
当你创建一个类时,你有一些方法告诉 Python 如何创建一个内置类。例如,重写 __int__ 方法告诉 Python 如果用户在类的实例上使用 int() 会返回什么。 __float__ 也一样。您甚至可以通过覆盖__iter__ 方法来控制Python 如何生成类的可迭代对象(这可以帮助Python 生成您的类的lists 和tuples)。我的问题是你将如何告诉 Python 如何为你的自定义类创建一个dict?没有特殊的__dict__ 方法,那么你会怎么做呢?我想要以下内容:
class Foo():
def __dict__(self):
return {
'this': 'is',
'a': 'dict'
}
foo = Foo()
dict(foo) # would return {'this': 'is', 'a': 'dict'}
我尝试让类继承自 dict,但由于子类试图从 dict 和 type 继承,因此在代码中稍后会引发错误,因此从 dict 继承不是可能性。还有其他方法吗?
另外,我已经覆盖了 __iter__ 方法,以便它返回一个 dict_keyiterator 对象(当您在 dict 上使用 iter() 时返回的内容),但它似乎仍然没有以应有的方式工作。
【问题讨论】:
-
你尝试过从
collections.abc.*Mapping继承吗? -
使用您的类比,我认为“您甚至可以通过覆盖
__iter__方法来控制 Python 如何从类中生成 可迭代对象 可能更清楚。 "dicts 是可迭代对象,就像列表和元组一样,您可以通过传入迭代器来创建它们。 -
@martineau,我认为在这种情况下您不会想使用
@staticmethod,对吗?大概您的to_dict需要访问实例才能将其属性转换为字典。 -
我有点通过在我的课堂上创建
keys方法找到了答案。如果你在一个类上使用dict,它会首先尝试使用keys()方法创建一个映射。我从这里得到它:stackoverflow.com/a/8601389/6212261 它不使用__iter__方法,所以我可以实现自己的__iter__方法并且仍然能够使用相同的方法制作dict类。 -
ForeverWintr: 对不起...当我写那条评论时,我的意思是
@classmethod,这意味着函数需要传递对象才能操作,所以对它的调用看起来像@ 987654352@——不管你是对的,还是让它成为一个常规方法会更好,所以调用可以简单地类似于result = foo_obj.to_dict()。
标签: python python-3.x dictionary iterator overriding