python定制数据类型(继承与授权)两种方式

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\n')
15 f.write('[error] ddddddd\n')
16 f.write('[error] ddddddd\n')
17 f.write('[error] ddddddd\n')
18 f.write('[error] ddddddd\n')
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)

 

posted @ 2017-04-24 23:59  福临  阅读(376)  评论(0编辑  收藏  举报