描述符学习中遇到的一个问题
>>> 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) ,这不更像描述符拥有者实例化对象的方法吗 在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 异常。 isdkz 发表于 2023-6-30 00:20
在Python中, instance.__dict__ 是一个字典,它存储了该实例的所有属性及其对应的值。因此,使用 instance ...
这个点还在线 忒感动了{:9_228:} 本帖最后由 isdkz 于 2023-6-30 00:29 编辑
nvli123 发表于 2023-6-30 00:24
这个点还在线 忒感动了
{:10_302:}
页:
[1]