A.授权方式 :
1 import time 2 class Open: 3 def __init__(self,filepath,mode = 'r',encoding='utf-8'): 4 self.x = open(filepath, mode=mode, encoding=encoding) 5 self .filepath = filepath 6 self.mode = mode 7 self.encoding = encoding 8 def write(self,line): 9 t = time.strftime('%Y-%m-%d-%X') 10 self.x.write('%s %s'%(t,line)) 11 def __getattr__(self, item): 12 return getattr(self.x,item) 13 f = Open('b.txt','r+') 14 f.write('[error] ddddddd ') 15 f.write('[error] ddddddd ') 16 f.write('[error] ddddddd ') 17 f.write('[error] ddddddd ') 18 f.write('[error] ddddddd ') 19 f.seek(0) 20 print(f.read()) 21 print("读取完了"+f.read())
运行结果 :
2017-04-24-23:29:26 [error] ddddddd 2017-04-24-23:29:26 [error] ddddddd 2017-04-24-23:29:26 [error] ddddddd 2017-04-24-23:29:26 [error] ddddddd 2017-04-24-23:29:26 [error] ddddddd 读取完了
授权案例二
1 # 基于授权定制自己的列表类型,要求定制的自己的__init__方法, 2 # 定制自己的append:只能向列表加入字符串类型的值 3 # 定制显示列表中间那个值的属性(提示:property) 4 # 其余方法都使用list默认的(提示:__getattr__加反射) 5 # import traceback,sys 6 class List: 7 """定制名为List类,继承自 list类型""" 8 def __init__(self,panda=None): 9 self.panda = panda 10 # if(type(panda) == list): #如果给进来的值是列表,就迭代 11 # for i,v in enumerate (panda): 12 # if v and type(v) == str : 13 # self.panda.append(v) 14 # # super().append(v) # 调用父类append将每项值写入 15 # else: 16 # self.panda.append(panda) 17 # # super().append(panda) 18 @property 19 def middle(self): 20 """猎取列表的中间值""" 21 return self.panda[int(len(self.panda) / 2)] 22 def append(self, p_object): 23 """追加选项到列表""" 24 if not isinstance(p_object,str): 25 raise TypeError("must be int") 26 self.panda.append(p_object) 27 # super().append(p_object) #调用父类的append方法追加 28 def __getattr__(self, item): 29 #利用反射,如果没有定义的item项, 30 # 就把它作为字符返回对象 31 return getattr(self.panda,item) 32 33 def __str__(self): #这个是把对象转字符串(反序列) 34 return str(self.panda) 35 l = List([1,2,"bb"]) 36 l.append("a") 37 l.append("["a1",23,"a2"]") 38 l.append("e") 39 l.insert(0,'33333') 40 l.insert(1,'aaaa') 41 print(l) 42 p = ['a','b','c'] 43 p=List(p) 44 p.append('k') 45 print(p) 46 print(p.middle) 47 48 l1 = List(['aa','ddd',1,2,"bb"]) 49 print(l1.middle)
B.继承方式:
1 # 基于授权定制自己的列表类型,要求定制的自己的__init__方法,
2 # 定制自己的append:只能向列表加入字符串类型的值
3 # 定制显示列表中间那个值的属性(提示:property)
4 # 其余方法都使用list默认的(提示:__getattr__加反射)
5 # import traceback,sys
6 class List(list):
7 """定制名为List类,继承自 list类型"""
8 def __init__(self,panda=None):
9 if(type(panda) == list): #如果给进来的值是列表,就迭代
10 for i,v in enumerate (panda):
11 if v and type(v) == str :
12 super().append(v) # 调用父类append将每项值写入
13 else:
14 super().append(panda)
15 @property
16 def middle(self):
17 """猎取列表的中间值"""
18 return self[int(len(self) / 2)]
19 def append(self, p_object):
20 """追加选项到列表"""
21 if not isinstance(p_object,str):
22 raise TypeError("must be int")
23 super().append(p_object) #调用父类的append方法追加
24 def __getattr__(self, item):
25 #利用反射,如果没有定义的item项,
26 # 就把它作为字符返回对象
27 return getattr(self,item)
28 l = List([1,2,"bb"])
29 l.append("a")
30 l.append("["a1",23,"a2"]")
31 l.append("e")
32 l.insert(0,'33333')
33 l.insert(1,'aaaa')
34 print(l)
35 # p = ['a','b','c']
36 # p=List(p)
37 # print(p.middle)
38 # print(l[int(len(l)/2)])
39 # l1 = List(['aa','ddd',1,2,"bb"])
40 # print(l1.middle)
1 class List(list): 2 """定制名为List类,继承自 list类型""" 3 4 def __init__(self, panda=None): 5 if (type(panda) == list): # 如果给进来的值是列表,就迭代 6 for i, v in enumerate(panda): 7 if v and type(v) == str: 8 super().append(v) # 调用父类append将每项值写入 9 else: 10 super().append(panda) 11 12 @property 13 def middle(self): 14 """猎取列表的中间值""" 15 return self[int(len(self) / 2)] 16 17 def append(self, p_object): 18 """追加选项到列表""" 19 if not isinstance(p_object, str): 20 raise TypeError("must be int") 21 super().append(p_object) # 调用父类的append方法追加 22 l = List(['a','b','c','d','l','m']) 23 l.append('keep') 24 l.append('keep') 25 l.insert(0,'dddd') #继承list类型的insert 26 print(l.middle) 27 print(l)