|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下面是一段描述符类的代码
class MyDescrpr: #定义一个描述符类
def __init__(self, value = 'X-man!'):
self.value = value
def __get__(self, instance, owner):
print('getting... ', self, instance, owner)
return self.value
def __set__(self, instance, value):
print('setting... ', self, instance, value)
self.value = value
class Test:
d = MyDescrpr()
t = Test()
print(t.d)
t.d = 5
print(t.d)
以下是输出结果:
==================== RESTART: F:/python/desper.py ===================
getting... <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
X-man!
setting... <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> 5
getting... <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
5
有一点还是不太理解,在Test类中,d是一个描述符类的对象,为什么能对一个对象进行直接赋值呢,为什么不能像其他普通的类一个,直接为其新建一个属性并赋值,比如:
>>> t.d.y = 3
这里会报错:
getting... <__main__.MyDescrpr object at 0x0000000002D30520> <__main__.Test object at 0x0000000002F99FA0> <class '__main__.Test'>
Traceback (most recent call last):
File "<pyshell#96>", line 1, in <module>
t.d.y = 3
AttributeError: 'int' object has no attribute 'y'
而在普通的类中:
class A:
pass
class B:
a = A()
b = B()
b.a.x = 1 # 这样赋值是允许的
print(b.a.x)
输出结果: 1 |
|