亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內置的特殊方法名稱功能可用于字典轉換

內置的特殊方法名稱功能可用于字典轉換

神不在的星期二 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 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號