python内置函数__getattr__、__serattr__、__delattr__与字典dict的使用

一、前言

今天看代码碰到了了类的一些内置函数,关于__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的方式丰富了获取、设置、删除属性的方法,最重要的是可以使用点符号来简化。

猜你喜欢

转载自blog.csdn.net/SL1029_/article/details/129638430