猿问

内置的特殊方法名称功能可用于字典转换

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

  • int(x) 来电 x.__int__()

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

但是,几个函数(即tuple()dict())没有任何等效项。我知道对这种特殊方法的需求尚未出现,但在某些情况下,dict()在类上调用转换方法可能会有用。我该如何实施?或者,您对尝试使用这种逻辑的人有何评论?

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


神不在的星期二
浏览 99回答 2
2回答

动漫人物

选项1: __iter__强制转换为tuple或dict,或采用可迭代的任何类型,都依赖于此__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__另外,要强制转换为a dict,您可以同时实现keys和__getitem__。class ListOfKeys():    def __init__(self, lst):        self.lst = lst    def keys(self):        yield from self.lst    def __getitem__(self, item):        return Nonelok = ListOfKeys([1, 2, 3])d = dict(lok)print(d) # {1: None, 2: None, 3: None}选项3:两者都支持多种类型最后,如果您希望您的类对adict和a进行强制转换具有不同的行为tuple,下面的示例演示了dict优先于keysand__getitem__解决方案的问题。class Foo:    def __iter__(self):        yield 1    def keys(self):        yield 2    def __getitem__(self, item):        return 3print(dict(Foo())) # {2: 3}print(tuple(Foo())) # (1,)
随时随地看视频慕课网APP

相关分类

Python
我要回答