nvli123 发表于 2023-6-30 00:18:37

描述符学习中遇到的一个问题

>>> 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__=value

上面代码中return instance.__dict__.get(self.name),为啥不是return instance.get(self.name) ,这不更像描述符拥有者实例化对象的方法吗

isdkz 发表于 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__ 来获取属性,如果属性不存在,会抛出 KeyError 异常。

nvli123 发表于 2023-6-30 00:24:11

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

这个点还在线   忒感动了{:9_228:}

isdkz 发表于 2023-6-30 00:27:31

本帖最后由 isdkz 于 2023-6-30 00:29 编辑

nvli123 发表于 2023-6-30 00:24
这个点还在线   忒感动了

{:10_302:}
页: [1]
查看完整版本: 描述符学习中遇到的一个问题