Python学习笔记(二十五)——第四十六、四十七、四十八讲
0、描述符就是一个类,一个至少实现__get__()、__set__()、__delete__()三个特殊方法中的任意一个的类
1、__get__()访问属性,返回属性的值
__set__()在属性分配操作中调用,不返回任何内容
__delete__()控制删除,不返回任何内容
2、都会打印
3、
20
0
4、访问实例层次上的描述符,只会返回描述符本身,所以需要定义在类的层次上
0、
class Mydes:
def __init__(self,value = None,name = None):
self.val = value
self.namae = 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('这个变量没法删除')
1、
import time as t
class Mydes:
def __init__(self,value = None,name = None):
self.val = value
self.name = name
self.filename = 'record.txt'
def __get__(self,instance,owner):
f = open(self.filename,'a',encoding = 'utf-8')
f.write('%s变量于北京时间%s被读取,%s = %s \n' % (self.name,t.ctime(),self.name,str(self.val)))
f.close()
return self.val
def __set__(self,instance,value):
self.val = value
f = open(self.filename,'a',encoding = 'utf-8')
f.write('%s变量于北京时间%s被修改,%s = %s \n' % (self.name,t.ctime(),self.name,str(self.val)))
f.close()
>>> class Test:
x = Mydes(10,'x')
y = Mydes(8.8,'y')
>>> test = Test()
>>> test.x
10
>>> test.y
8.8
>>> test.x=123
>>> test.x=1.23
>>> test.y='I love you'
>>>
2、
import os
import pickle
class Mydes:
saved = []
def __init__(self, name = None):
self.name = name
self.filename = self.name + '.pkl'
def __get__(self,instance,owner):
if self.name not in Mydes.saved:
raise AttributeError('%s属性还没有赋值' % (self.name))
with open(self.filename,'rb') as f:
value = pickle.load(f)
return value
def __set__(self,instance,value):
with open(self.filename,'wb') as f:
pickle.dump(value,f)
Mydes.saved.append(self.name)
def __delete__(self,instance):
os.remove(self.filename)
Mydes.saved.remove(self.name)
>>> class Test:
x = Mydes('x')
y = Mydes('y')
>>> test = Test()
>>> test.x=123
>>> test.y='I love you'
>>> test.x
123
>>> test.y
'I love you'
>>> del test.x
class CountList(list):
def __init__(self,*args):
super().__init__(args)
self.count = []
for i in args:
self.count.append(0)
def __len__(self):
return len(self.count)
def __getitem__(self,key):
self.count[key] += 1
return super().__getitem__(key)
def __setitem__(self,key,value):
self.count[key] += 1
return super().__setitem__(key,value)
def __delitem__(self,key):
del self.count[key]
return super().__delitem__(key)
def counter(self,key):
return self.count[key]
def append(self,value):
self.count.append(0)
super().append(value)
def pop(self,key = -1):
del self.count[key]
return super().pop(key)
def remove(self,value):
key = super().index(value)
del self.count[key]
super().remove(value)
def insert(self,key,value):
self.count.insert(key,0)
super().insert(key,value)
def clear(self):
self.count.clear()
super().clear()
def reverse(self):
self.count.reverse()
super().reverse()
运行结果
>>> a=CountList('x','y')
>>> a
['x', 'y']
>>> a[0] = 1
>>> a
[1, 'y']
>>> len(a)
2
>>> a.counter(0)
1
>>>
import datetime as t
class leapyear:
def __init__(self):
self.nt = t.date.today().year
def isleapyear(self,year):
if (year%4 == 0 and year%100 != 0) or (year%400 == 0):
return True
else:
return False
def __iter__(self):
return self
def __next__(self):
while not self.isleapyear(self.nt):
self.nt -= 1
temp = self.nt
self.nt -= 1#将年份提前一年便于下次判断
return temp
运行结果
>>> a = leapyear()
>>> for i in a:
if i >= 2000:
print(i)
else:
break
2016
2012
2008
2004
2000
class Myrev:
def __init__(self,data):
self.data = data
self.len1 = len(self.data)
def __iter__(self):
return self
def __next__(self):
if self.len1 == 0:
raise StopIteration
self.len1 -= 1
temp = self.data[self.len1]
return temp
运行结果
>>> a = Myrev('love')
>>> for i in a:
print(i,end='')
evol