Python的高级特性11:拓展基本数据类型(dict)
字典的创建有两种方式,如果出现In 这样的赋值方式就会报错。In : s['name'] = 'alex'
In : s['sex'] = 'male'
In : s
Out: {'name': 'alex', 'sex': 'male'}
In : s = {'name':'alex','sex':'male'}
In : s
Out: {'name': 'alex', 'sex': 'male'}
In : t = {}
In : t['name'] = 'lilei'
In : t['sex'] = 'male'
In : t
Out: {'name': 'lilei', 'sex': 'male'}
In : 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'
但我这个人很固执,就对这种方式情有独钟,迫切希望Python可以拓展这个属性,该怎么办呢?最好的办法就是自己来拓展。
t.name = 'hanmeimei' 这样的set方式明显是__setter__行为,那么我只需要重写__setter__方法就可以了。
class StrongerDict(dict):
def __getattr__(self, key):
return self
def __setattr__(self, key, value):
self = value
def __call__(self, key):
return self
s = StrongerDict()
#__setattr__方法
s.name = 'alex'
#dict本身赋值方法不受影响,因为重写的是__setattr__方法
s['sex'] = 'male'
print(s)
#__getattr__方法
print(s.name)
运行结果是:
/System/Library/Frameworks/Python.framework/Versions/3.4/bin/python3 /Users/lsf/PycharmProjects/py3Project/test3.py
{'sex': 'male', 'name': 'alex'}
alex
Process finished with exit code 0
页:
[1]