• 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
    ')
    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)
  • 相关阅读:
    Android应用性能测试之CPU和内存占用
    每天一个linux命令(30): chown命令
    安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
    android adb shell 命令大全
    adb logcat命令查看并过滤android输出log
    Ubuntu里字符编码设置
    linux下GBK->UTF-8文件编码批量转换脚本
    Android开发之如何保证Service不被杀掉(broadcast+system/app)
    android的m、mm、mmm编译命令的使用
    解决 samba不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接
  • 原文地址:https://www.cnblogs.com/hongyongshang/p/6759875.html
Copyright © 2020-2023  润新知