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)