|
10鱼币
- class MyDes:
- def __init__(self,number,writ):
- self.number = number
- self.writ = writ
- def __get__(self, instance, owner):
- print('现在获取变量%s' %self.writ)
- return self.number
- def __set__(self, instance, value):
- print('变量%s在修改' %self.writ)
- self.number = value
- def __delete__(self, instance):
- print('正在山删除%s'%self.writ)
- print('变量:x删不了。')
- class Test:
- x = MyDes(10,'x')
- test = Test()
复制代码
上面代码正常运行后,正常调用x,何修改x。
- >>> test.x
- 现在获取变量x
- 10
- >>> test.x = 1
- 变量x在修改
复制代码
但我有想法,能不嫩创建个变量y能,然后实现上面变量x一样的功能。
- >>> test.y = MyDes(4,'y')
- >>> test.y
- <__main__.MyDes object at 0x0000020C3CC3B848>
- >>> test.y = 23
- >>> test.y
- 23
- >>>
复制代码
1、为什么会失败?原因在哪?
2、我这想法能实现吗?
因为描述符只有作用在 类 层面上,Python 才会自动调用描述符的 __get__ 和 __set__
而此时你的 test 是 Test 类的实例对象,那么 test.y = MyDes(4, 'y') 实际上是在创建一个 实例属性,即类中带 self.变量名 的属性,而不是类层面上的属性
可以实现,你只需将赋值过程用实例对象改成用类本身即可,如下代码:
即可成功创建了描述符,此时你在对实例进行 test.y 就能发现获取成功
|
最佳答案
查看完整内容
因为描述符只有作用在 类 层面上,Python 才会自动调用描述符的 __get__ 和 __set__
而此时你的 test 是 Test 类的实例对象,那么 test.y = MyDes(4, 'y') 实际上是在创建一个 实例属性,即类中带 self.变量名 的属性,而不是类层面上的属性
可以实现,你只需将赋值过程用实例对象改成用类本身即可,如下代码:
即可成功创建了描述符,此时你在对实例进行 test.y 就能发现获取成功
|