为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2021-05-19 13:14:18
我一直在研究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
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

选项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 None


lok = 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 3


print(dict(Foo())) # {2: 3}

print(tuple(Foo())) # (1,)


查看完整回答
反对 回复 2021-05-25
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信