|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
class MyDes:
def __init__(self, initval=None, name=None):
self.val = initval
self.name = name
def __get__(self, instance, owner):
print("正在获取变量:", self.name)
return self.val
def __set__(self, instance, value):
print("正在修改变量:", self.name)
super().__setattr__(self.name,value)
def __delete__(self, instance):
print("正在删除变量:", self.name)
print("噢~这个变量没法删除~")
class Test:
x = MyDes(10, 'x')
class MyDes:
def __init__(self, initval=None, name=None):
self.val = initval
self.name = name
def __get__(self, instance, owner):
print("正在获取变量:", self.name)
return self.val
def __set__(self, instance, value):
print("正在修改变量:", self.name)
self.val = value
def __delete__(self, instance):
print("正在删除变量:", self.name)
print("噢~这个变量没法删除~")
class Test:
x = MyDes(10, 'x')
为什么两种代码相差这么大,能帮解释一下吗
为什么第二种代码不会有无限递归错误,self.val = value 不会再触发__set__(self,instance,value)吗
在帮忙解释一下__set__ 和__setattr__的区别
再解释一下
这两种代码相差很大,因为第一种代码中的__set__方法调用了super().__setattr__(self.name, value)来修改属性值,而super()会调用父类的__setattr__方法,从而避免了无限递归错误。
在第二种代码中,__set__方法直接使用self.val = value来修改属性值,这不会触发__set__方法的递归调用。这是因为__set__方法中的self.val = value是对实例属性进行赋值操作,而不是调用__set__方法来修改属性值。
__set__和__setattr__的区别在于:
· __set__是描述符协议中定义的特殊方法,用于控制属性赋值时的行为。它只能定义在描述符类中,并且可以通过属性访问方式来调用,例如instance.attr = value。
· __setattr__是对象的特殊方法,用于给对象的属性赋值时的行为。它可以定义在普通类或描述符类中,并且可以通过属性赋值方式来调用,例如instance.attr = value。
总结起来,__set__是描述符类中用于控制属性设置过程的方法,而__setattr__是对象中用于控制属性设置过程的方法。
如果问题已经解决,请设置最佳答案
|
|