字典的创建有两种方式,如果出现 In [26]
这样的赋值方式就会报错。
In [17]: s['name'] = 'alex'
In [18]: s['sex'] = 'male'
In [19]: s
Out[19]: {'name': 'alex', 'sex': 'male'}
In [20]: s = {'name':'alex','sex':'male'}
In [21]: s
Out[21]: {'name': 'alex', 'sex': 'male'}
In [22]: t = {}
In [23]: t['name'] = 'lilei'
In [24]: t['sex'] = 'male'
In [25]: t
Out[25]: {'name': 'lilei', 'sex': 'male'}
In [26]: t.name = 'hanmeimei'
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-26-62e0b27ded5b> in <module>()
----> 1 t.name = 'hanmeimei'
AttributeError: 'dict' object has no attribute 'name'
t.name = 'hanmeimei'
这样的 set
方式明显是__setter__
行为,那么只需要重写__setter__
方法就可以了。
class StrongerDict(dict):
def __getattr__(self, key):
return self[key]
def __setattr__(self, key, value):
self[key] = value
def __call__(self, key):
return self[key]
s = StrongerDict()
__setattr__
方法
s.name = 'alex'
dict
本身赋值方法不受影响,因为重写的是 __setattr__
方法
s['sex'] = 'male'
print(s)
{'name': 'alex', 'sex': 'male'}
__getattr__
方法
print(s.name)
alex