• 继承的方式完成包装


    class Foo:
       def __init__(self, name):
          self.name = name
    
       def __setattr__(self, key, value):
          if type(value) is str: # 根据属性值类型进行判断,如果为字符串类型则成功添加
             self.__dict__[key] = value
          else:
             print('数据类型错误')
    
       def __getattr__(self, item):
          print('你找的%s属性不存在' % item)
    
       def __delattr__(self, item):
          self.__dict__.pop[item]
    
    f1 = Foo('alex')
    print(f1.name)
    
    
    '''包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其它的标准类型均可以通过下面的方式进行二次加工)'''
    class List(list): # list类实例化后的对象是一个列表,也就是说实例本身self就是一个列表
       def show_midlle(self):
          index = len(self) // 2
          return self[index]
    
       def append(self, object):
          if type(object) is str:
             # list.append(self, object) # 父类调用自己的方法,属于类调用自己的函数属性
             super().append(object) # 等同于super(List, self).append(object)
          else:
             print('只能添加字符串类型')
    
    l1 = list('hello')
    print(l1, type(l1)) # ['h', 'e', 'l', 'l', 'o'] <class 'list'>
    
    l2 = List('hello')
    print(l2, type(l2)) # ['h', 'e', 'l', 'l', 'o'] <class '__main__.List'>
    print(List.__dict__)
    print(l2.show_midlle())
    
    l2.append('alex')
    print(l2)
    l2.append(1)
    print(l2)
    
    
    # clear()加权限限制
    class List(list):
       def __init__(self, item, tag=False):
          super().__init__(item)
          self.tag = tag
    
       def append(self, p_object):
          if not isinstance(p_object, str):
             raise TypeError
          super().append(p_object)
    
       def clear(self):
          if not self.tag:
             raise PermissionError
          super().clear()
    
    l = List([1,2,3],False)
    print(l)
    print(l.tag)
    
    l.append('saf')
    print(l)
    
    # l.clear() # 异常
    # print(l)
    
    l.tag = True
    l.clear()
    print(l)
    while True: print('studying...')
  • 相关阅读:
    Java中的多线程你只要看这一篇就够了
    模板CodeTemplate
    mybatis_mysql
    Kettle 使用Json输入
    图解ByteBuffer
    双队列缓存
    log4j.properties配置详解与实例
    Kettle 使用Json输入
    JSON响应端模拟测试
    使用Kettle导出excel
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14709083.html
Copyright © 2020-2023  润新知