一. 方便但不完美的__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的方式如下, 如果直接使用會報錯.
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)
通過這種方式, 既可以支持類變量的轉換, 又可以自定義需要轉換的字段.
完整代碼:
'''當對實例化對象使用dict(obj)的時候, 會調用這個方法,這裡定義了字典的鍵, 其對應的值將以obj['name']的形式取,
但是對象是不可以以這種方式取值的, 為了支持這種取值, 可以為類增加一個方法'''
return ('name', 'age', 'gender')
'''內置方法, 當使用obj['name']的形式的時候, 將調用這個方法, 這裡返回的結果就是值'''
r = dict(a)
print(r)
一. 方便但不完美的__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)