zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    什么是垃圾回收??
    Nginx教程3:SSL设置
    Nginx教程2:性能
    Nginx教程1:基本概念
    iOS 设计中-- 自定义-- 评星图标的方法
    iOS设计中对Xcode设置中创建PCH文件的过程
    iOS设计中不同屏幕适配的方法-登陆界面
    iOS设计之--OC学习总结之延展类目协议
    iOS 最新版 CocoaPods 的安装流程介绍
    iOS基本UI控件总结
  • 原文地址:https://www.cnblogs.com/hongyongshang/p/6759875.html
Copyright © 2011-2022 走看看