一、前言
今天看代码碰到了了类的一些内置函数,关于__getattr__、__serattr__、__delattr__,顺便学习python的字典继承
class dotdict(dict):
"""
Dict subclass that allows dot.notation to access attributes.
字典子类允许点符号来访问属性
"""
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
继承python字典类dict
也即可以用obj.属性获取值
1.获取属性值
例:
1.1dotdict获取属性值
想要获取dotdict里面存在的属性的值有四种方式,设p为对象
1.p.属性
2.p["属性"]
3.getattr(p, "属性")
4.p.__getattr__("属性")
p1 = dotdict(apple = 10, banana = 20, orange = 30, pear = 40, cherry = 50, peach = 60)
p2 = dict(apple = 10, banana = 20, orange = 30, pear = 40, cherry = 50, peach = 60)
# dotdict获取属性值方法
print(p1.apple)
print(p1["apple"])
print(getattr(p1, "apple"))
print(p1.__getattr__("apple"))
<<
10
10
10
10
1.2.单纯字典dict获取值方法
p["属性"]
print(p2["apple"])
<<10
Ps:获取不存在的属性值时,dotdict会返回None,而使用dict方式会报错
print(p1.graph)
print(getattr(p1, "graph"))
print(p1.__getattr__("graph"))
print(p1["graph"])
<<
None
None
None
Traceback (most recent call last):
File "c:\Users\23202\Desktop\Postgraduate study\python\dict\test_1.py", line 29, in <module>
print(p1["graph"])
KeyError: 'graph'
2.加入属性
2.1.dotdict也有四种方式加入属性
1.p.属性=值
2.p["属性"] = 值
3.getattr(p, "属性",值)
4.p.__getattr__("属性",值)
p1.graph1 = 70
p1["graph2"] = 80
setattr(p1, "graph3", 90)
p1.__setattr__("graph4", 100)
print(p1)
<<
{'apple': 10,'banana': 20, 'orange': 30, 'pear': 40, 'cherry': 50, 'peach': 60, 'graph1':70, 'graph2': 80, 'graph3': 90, 'graph4': 100}
2.2.dict加入属性方法
p["属性"] = 值
p2["graph2"] = 800
print(p2)
<<{'apple': 10, 'banana': 20, 'orange': 30, 'pear': 40, 'cherry': 50,'peach': 60, 'graph2': 800}
3.删除属性
3.1.dotdict删除属性方法
1.p.属性=None
2.p["属性"] = None
3.getattr(p, "属性",None)
4.p.__getattr__("属性",None)
5.delattr(p,"属性")
6.p.__delattr__("属性")
7.del p["属性"]
前四种方式不能算真正删除,只是将值设置为了None,属性还存在,只能算修改属性
p1.__delattr__("apple")
delattr(p1, "pear")
del p1["banana"]
print(p1)
<<{'orange': 30, 'cherry': 50, 'peach': 60}
后三种方式才是真正删除
3.2.dict删除属性方法
1.del p["属性"]
del p2["apple"]
print(p2)
<<{'banana': 20, 'orange': 30, 'pear': 40, 'cherry': 50, 'peach': 60}
Ps:个人觉得使用dotdict这种继承dict的方式丰富了获取、设置、删除属性的方法,最重要的是可以使用点符号来简化。