|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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) ,这不更像描述符拥有者实例化对象的方法吗
在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 异常。
|
|