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

文章介绍了Python中dotdict类如何通过__getattr__、__setattr__和__delattr__实现字典的属性访问,比较了dotdict与普通dict在获取、设置和删除属性时的行为差异,强调了dotdict使用点符号的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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

在提供的代码中,`__setattr__`方法被重写为`dict.__setitem__`,这意味着当我们给对象的属性赋值时,实际上是调用了`dict.__setitem__`方法来设置字典中的键值对。这样做的目的是为了让对象支持通过点操作符来设置属性,使得对象可以像访问属性一样访问字典的键值对。这种做法在某些情况下可以提供更直观和方便的使用方式。 除了`__setattr__`方法外,还有`__getattr__`和`__delattr__`方法。`__getattr__`方法被重写为`dict.get`方法,当属性不存在时,会返回None,而不是抛出AttributeError异常。`__setattr__`方法被重写为`dict.__setitem__`,用于设置属性值。`__delattr__`方法被重写为`dict.__delitem__`,用于删除属性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python对象和字典dict的相互转化【点.和[属性]】的访问区别及特殊方法名总结](https://blog.youkuaiyun.com/weixin_43343144/article/details/92764884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python字典转对象的两种方法(dict -> object使属性用点来调用)](https://blog.youkuaiyun.com/qq_21567385/article/details/107990864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python内置函数__getattr__、__serattr__、__delattr__字典dict使用](https://blog.youkuaiyun.com/SL1029_/article/details/129638430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值