描述符 MyDes:当类的属性被访问、修改或设置的时候,分别做出提醒。
class Remind:
def __init__(self,value=None,name=None):
self.name=name
self.val=value
def __get__(self,instance,owner):
print("正在获取属性%s" % self.name)
return self.val
def __set__(self,instance,value):
print("正在设置属性%s" % self.name)
self.val=value
def __delete__(self,instance):
print("正在删除属性%s" % self.name)
期望的输出效果是
>>> class Test:
x = MyDes(10, 'x')
>>> test = Test()
>>> y = test.x
正在获取变量: x
>>> y
10
>>> test.x = 8
正在修改变量: x
>>> del test.x
正在删除变量: x
>>> test.x
正在获取变量: x
8
但是实际上的结果
在set和del的时候都不打印内容这是为啥啊??
赋值后打印一下看看实例a的test是多少,我猜还是15
a.test = 45
print(a.test)
第一次看到描述符这个东西。
根据我现场找到的文章,45被赋值给C这个类,而不是a这个实例了。
解决方案是
class Desc:
def __init__(self, value):
self.value = value
def __get__(self, ins, cls):
return self.value
def __set__(self, ins, value):
self.value = value
def __delete__(self, ins):
raise AttributeError('not allowed to delete attribute name ' )
class A:
name=Desc('JS')
a=A()