(标答出处: 鱼C论坛)
《零基础入门学习Python》
本章知识点:
◇描述符就是将某种特殊类型的类的实例指派给另一个类的属性
◇属性方法:
(1)__ get __ (self,instance,owner)
(2)__ set __ (self,instance,value)
(3)__ delete__ (self,intance)
例子and练习:
**·**先定义一个温度类,然后定义两个描述符用于描述摄氏度和华氏度两个属性。
**·**要求两个属性会自动进行转换,也就是说你可以给摄氏度这个属性赋值,然后答疑的华氏度属性是自动转换后的结果。
class Centigrade :
def __init__ (self , value = 26.0) :
self.value = float(value)
def __get__ (self,instance,owner) :
return self.value
def __set__ (self,instance,value) :
self.value = float(value)
def __delete__ (self,intance) :
del self.value
class Fahrenheit :
def __get__ (self,instance,owner) :
return instance.cen * 1.8 +32
def __set__ (self,instance,value) :
instance.cen = float(value - 32) / 1.8
class Temperature :
cen = Centigrade()
fah = Fahrenheit()
temp = Temperature()
print (temp.cen)
temp.cen = 38
print (temp.fah)
temp.fah = 108
print (temp.cen)
运行结果:
测试题(笔试,不能上机哦):
答:有时候,某个应用程序可能会有一个相当微妙的需求,需要你设计一些更为复杂的操作来响应(例如每当属性被访问时,你也许像创建一个日志记录)。最好的解决方法就是编写一个用于执行这些 “更复杂的操作” 的特殊函数,然后指定他在属性被访问时运行。那么一个具有这种函数的对象被称之为描述符。
简单说,描述符就是一个类,一个至少实现__ get __ (self,instance,owner)、__ set __ (self,instance,value)、__ delete__ (self,intance) 三种特殊方法中任意一个的类。
答:通过三个魔法方法来对属性的get、set和delete进行操作
__ get __ (self,instance,owner)
__ set __ (self,instance,value)
__ delete__ (self,intance)
答:都会打印 getting ,因为 x = a 等同于把 MyDes() 赋值给了 x 。
答: 会打印如下:
20
0
答:9 (错误!!!!)
动动手
class MyDes() :
def __init__(self,value,duixiang) :
self.duixiang = duixiang
self.value = value
def __get__(self,isinstance,owner) :
print ('正在获取变量:%s' %self.duixiang)
return self.value
def __set__(self,isinstance,value) :
print('正在修改变量:%s' %self.duixiang)
self.value = value
def __delete__(self,isinstance) :
print ('正在删除变量:%s' %self.duixiang)
print ('噢~这个变量没法删除~')
class Test() :
x = MyDes(10,'x')
test = Test()
y = test.x
print (y)
test.x = 8
del test.x
print (test.x)
运行结果:
import time as t
class Record() :
def __init__(self,value,duixiang) :
self.value = value
self.duixiang = duixiang
self.filename = "record.txt"
def filewrite (self,filename,pattern) :
file1 = open (filename,'a')
if pattern == 'duqu':
file1.write("%s 变量于北京时间 %s 被读取,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
elif pattern == 'xiugai' :
file1.write("%s 变量于北京时间 %s 被修改,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
elif pattern == 'shanchu' :
file1.write("%s 变量于北京时间 %s 被删除,%s = %s\n" %(self.duixiang , t.asctime(),self.duixiang,self.value))
def __get__(self,isinstance,owner) :
Record.filewrite(self,self.filename,'duqu')
return self.value
def __set__(self,isinstance,value) :
self.value = value
Record.filewrite(self,self.filename,'xiugai')
def __delete__ (self,isinstance) :
Record.filewrite(self,self.filename,'shanchu')
del self.duixiang
class Test() :
x = Record(10,'x')
y = Record(8.8,'y')
test = Test()
print (test.x)
print (test.y)
test.x = 123
test.x = 1.23
test.y = "I love Xmy !"
运行结果:
import pickle
import os
class MyDes() :
def __init__(self,duixiang,value = None) :
self.value = value
self.duixiang = duixiang
def filewrite (self,duixiang,value) :
file1 = open (duixiang+'.pkl','wb')
pickle.dump(self.value , file1)
def __get__(self,isinstance,owner) :
return self.value
def __set__(self,isinstance,value) :
self.value = value
MyDes.filewrite(self,self.duixiang,self.value)
def __delete__ (self,isinstance) :
os.remove(self.duixiang+'.pkl')
del self.duixiang
class Test() :
x = MyDes('x')
y = MyDes('y')
test = Test()
test.x = 123
test.y = "I love Xmy !"
print (test.x)
print (test.y)
#del test.x
运行结果: