gpt4 book ai didi

python - 用于字典转换的特殊方法名称的内置函数

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:48 24 4
gpt4 key购买 nike

我一直在深入研究 Python 类中的运算符重载和特殊方法,我注意到许多内置函数都有其等效的特殊方法名称:

  • int(x) 调用 x.__int__()
  • next(x) 在 Python 2 中调用 x.__next__()x.next()

然而,一些函数,即 tuple()dict(),没有任何等价物。我知道还没有出现对此类特殊方法的需求,但在某些情况下,在类上调用的 dict() 转换方法可能很有用。我该如何实现?或者,您对试图使用这种逻辑的人有何评论?

# I think this is quite interesting, so I shall post my own implementation of it as well

最佳答案

选项 1:__iter__

转换为 tupledict,或任何接受迭代的类型,依赖于 __iter__ 方法。

class ListOfKeys():
def __init__(self, lst):
self.lst = lst

def __iter__(self):
for k in self.lst:
yield (k, None)

lok = ListOfKeys([1, 2, 3])
d = dict(lok)

print(d) # {1: None, 2: None, 3: None}

这同样适用于元组。

t = tuple(lok)

print(t) # ((1, None), (2, None), (3, None))

选项 2:keys__getitem__

或者,要转换为 dict,您可以同时实现 keys__getitem__

class ListOfKeys():
def __init__(self, lst):
self.lst = lst

def keys(self):
yield from self.lst

def __getitem__(self, item):
return None

lok = ListOfKeys([1, 2, 3])
d = dict(lok)

print(d) # {1: None, 2: None, 3: None}

选项3:两者都支持多种类型

最后,如果您希望您的类在转换为 dicttuple 时具有不同的行为,以下示例演示了 dict将优先处理 keys__getitem__ 解决方案。

class Foo:
def __iter__(self):
yield 1

def keys(self):
yield 2

def __getitem__(self, item):
return 3

print(dict(Foo())) # {2: 3}
print(tuple(Foo())) # (1,)

关于python - 用于字典转换的特殊方法名称的内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51846827/

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