回覆列表
  • 1 # 餓了不吃980

    一. 方便但不完美的__dict__

    對象轉字典用到的方法為__dict__. 比如對象對象a的屬性a.name='wk', a.age=18, 那麼如果直接將使用a.__dict__獲得對應的字典的值為: {name: 'wk', aget:18}, 很方便, 但是也存在一些限制. 其不完美之處在於:

    比如:

    class A(object):

    name = 'wukt'

    age = 18

    def __init__(self):

    self.gender = 'male'

    a = A()

    print(a.__dict__)

    此時的打印結果是:

    {gender: 'male'}

    但是類變量name和age無法一同轉換.

    二. 使用dict

    使用dict的方式如下, 如果直接使用會報錯.

    a = A()

    dict(a)

    使用dict之時, 將自動調用類中的keys方法, keys中定義了字典的鍵, 調用keys方法後, 程序將依照字典取值的方式嘗試獲得這些鍵對應的值.

    當使用如字典的取值方式時: 比如a['name'], 將會調用類中的__getitem__方法, __getitem__方法決定了這個值是多少.

    因此只需要在一例中添加兩個方法就可以使對象可以通過dict轉字典:

    def keys(self):

    return ('name', 'age' )

    def __getitem__(self, item):

    return getattr(self, item)

    通過這種方式, 既可以支持類變量的轉換, 又可以自定義需要轉換的字段.

    完整代碼:

    class A(object):

    name = 'wukt'

    age = 18

    def __init__(self):

    self.gender = 'male'

    def keys(self):

    '''當對實例化對象使用dict(obj)的時候, 會調用這個方法,這裡定義了字典的鍵, 其對應的值將以obj['name']的形式取,

    但是對象是不可以以這種方式取值的, 為了支持這種取值, 可以為類增加一個方法'''

    return ('name', 'age', 'gender')

    def __getitem__(self, item):

    '''內置方法, 當使用obj['name']的形式的時候, 將調用這個方法, 這裡返回的結果就是值'''

    return getattr(self, item)

    a = A()

    r = dict(a)

    print(r)

  • 中秋節和大豐收的關聯?
  • 露馬腳的故事?