鱼C论坛

 找回密码
 立即注册
查看: 1583|回复: 3

[已解决]描述符学习中遇到的一个问题

[复制链接]
发表于 2023-6-30 00:18:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> class C:
...     def __set_name__(self,owner,name):
...         self.name=name
...     def __get__(self,instance,owner):
...         print('get')
...         return instance.__dict__.get(self.name)
...     def __set__(self,instance,value):
...         print('set')
...         instance.__dict__[self.name]=value

上面代码中return instance.__dict__.get(self.name),为啥不是return instance.get(self.name) ,这不更像描述符拥有者实例化对象的方法吗
最佳答案
2023-6-30 00:20:35
在Python中, instance.__dict__ 是一个字典,它存储了该实例的所有属性及其对应的值。因此,使用 instance.__dict__.get(self.name) 可以从这个字典中获取到指定名称的属性值。

instance.get(self.name) 会试图调用 instance 对象的 get 方法,而不是获取属性。不是所有的Python对象都会有 get 方法,但是所有的Python对象都有 __dict__ 属性(除非在类中定义了 __slots__ ),所以使用 instance.__dict__.get(self.name) 通常是更安全的做法。

实际上,如果你在类中定义了一个 get 方法,并试图通过 instance.get(self.name) 来获取属性,这可能会导致无法预见的结果,因为这个 get 方法可能并不是用来获取属性值的。相反, __dict__.get() 方法是明确设计用来获取属性值的。

此外, __dict__.get() 方法还有一个优点,那就是如果属性不存在,它不会抛出异常,而是返回一个 None 。这可以避免因为试图访问不存在的属性而导致的错误。而如果你直接使用 instance.__dict__[self.name] 来获取属性,如果属性不存在,会抛出 KeyError 异常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-30 00:20:35 | 显示全部楼层    本楼为最佳答案   
在Python中, instance.__dict__ 是一个字典,它存储了该实例的所有属性及其对应的值。因此,使用 instance.__dict__.get(self.name) 可以从这个字典中获取到指定名称的属性值。

instance.get(self.name) 会试图调用 instance 对象的 get 方法,而不是获取属性。不是所有的Python对象都会有 get 方法,但是所有的Python对象都有 __dict__ 属性(除非在类中定义了 __slots__ ),所以使用 instance.__dict__.get(self.name) 通常是更安全的做法。

实际上,如果你在类中定义了一个 get 方法,并试图通过 instance.get(self.name) 来获取属性,这可能会导致无法预见的结果,因为这个 get 方法可能并不是用来获取属性值的。相反, __dict__.get() 方法是明确设计用来获取属性值的。

此外, __dict__.get() 方法还有一个优点,那就是如果属性不存在,它不会抛出异常,而是返回一个 None 。这可以避免因为试图访问不存在的属性而导致的错误。而如果你直接使用 instance.__dict__[self.name] 来获取属性,如果属性不存在,会抛出 KeyError 异常。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 00:24:11 | 显示全部楼层
isdkz 发表于 2023-6-30 00:20
在Python中, instance.__dict__ 是一个字典,它存储了该实例的所有属性及其对应的值。因此,使用 instance ...

这个点还在线   忒感动了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 00:27:31 | 显示全部楼层
本帖最后由 isdkz 于 2023-6-30 00:29 编辑
nvli123 发表于 2023-6-30 00:24
这个点还在线   忒感动了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 18:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表