Python入门-面向对象-特殊方法
调用拦截功能
class Message: def send(self,info): print("消息发送:",info) class Me: def __getattribute__(self, item): print("attribute:", item) #执行拦截的操作 return object.__getattribute__(self, item) # 放开拦截的操作 def send(self,info): print("消息发送:",info) class Lanjie: def __getattribute__(self, item): if item == "content": return "这是拦截信息" elif item == "send": return self.other # 返回其他方法的引用 else: return object.__getattribute__(self, item) # 放开拦截 def send(self,info): print("消息发送:",info) def other(self, note): print("【替换方法】other:", note) if __name__ == '__main__': m = Message() print("=============不拦截代码演示:=============") m.info="百度一下" print(m.info) m.send("www.baidu.com") print("============拦截代码演示:=============") me = Me() me.info = "www.google.com" print(me.info) #调用拦截 me.send("www.google.com")#调用拦截 #所有的拦截,都是自动完成的 print("============拦截后替换方法演示:=============") lj = Lanjie() lj.content = "lanjie的content" print(lj.send("www.com"))
获取属性字典
class Message(object): def __init__(self, note): self.__note = note class Me: def __init__(self, note): self.__note = note # 定义私有属性 def remove_note(self): #note为属性封装,通过类的内部才可以进行访问 del self.__note def get_note(self): return self.__note def __setattr__(self, key, value): print("【setattr】key={},value={}".format(key, value)) def __getattr__(self, item): print("【getattr】item=", item) def __delattr__(self, item): print("【del attr】item =", item) class M: def __init__(self, note): self.__note = note # 定义私有属性 def remove_note(self): #note为属性封装,通过类的内部才可以进行访问 del self.__note def get_note(self): return self.__note def __setattr__(self, key, value): print("【setattr】key={},value={}".format(key, value)) self.__dict__[key] = value def __getattr__(self, item): print("【getattr】item=", item) return "{}属性不存在,没有返回值".format(item) def __delattr__(self, item): print("【del attr】item =", item) self.__dict__.pop(item) # 从字典里面删除属性 if __name__ == '__main__': m = Message("note属性") m.content = "www.baidu.com" print(m.__dict__) # 程序中msg实例化对象的两个属性,都保存在dict字典中 # 设置属性拦截:必须手工设置dict参数数据 # 获取属性拦截:当属性不存在的时候才会拦截 # 删除属性拦截: # "setattr, getattr, delattr") print("========开始属性监听=========") me = Me("www.google.com") print("获取存在的属性:", me.get_note()) print("获取不存在的属性:", me.content) me.remove_note() print("========属性监听放开=========") m = M("www.google.com") print("获取存在的属性:", m.get_note()) print("获取不存在的属性:", m.content) m.remove_note()
获取子类实例化的信息
# 子类获取父类的实例化,可以定义父类的元数据 class Parent: def __init__(self): print("parent的初始化init") def __init_subclass__(cls, **kwargs): print("父类parent_subclass:", cls) print("父类parent_subclass:", kwargs) class Sub(Parent, url="www.baidu.com", title="百度"): def __init__(self): print("子类sub的init") if __name__ == '__main__': sub = Sub() """ 父类parent_subclass: <class '__main__.Sub'> 父类parent_subclass: {'url': 'www.baidu.com', 'title': '百度'} 子类sub的init """
自定义迭代
class Message: def __init__(self, max): self.__max = max self.__foot = 0 def __iter__(self): return self def __next__(self): if self.__foot >= self.__max: raise StopIteration() #如果死循环,停止迭代 else: val = self.__max - self.__foot self.__foot += 1 return val if __name__ == '__main__': m = Message(10) for i in m: if i ==1: break # 不用break结束,就会死循环 print(i, end=",") #执行结果:10,9,8,7,6,5,4,3,2,
对象反转
class Message: def __init__(self): self.__mlist = ["百度", "阿里", "腾讯"] def get_list(self): return self.__mlist def __reversed__(self): self.__mlist = reversed(self.__mlist) if __name__ == '__main__': m = Message() print("下面是自定义的反转操作:") reversed(m) for i in m.get_list(): print(i, end=",") """ 下面是自定义的反转操作: 腾讯,阿里,百度, """
字典操作支持
#字典获取为key,value,以及字典【】 # 与字典的操作一致 class Message: def __init__(self): self.__map = {} def __setitem__(self, key, value): print("【set item】设置数据:key={}, value={}".format(key, value)) self.__map[key] = value def __getitem__(self, item): print("【get item】获取数据:item=", item) return self.__map[item] def __len__(self): return len(self.__map) def __delitem__(self, key): print("【del item】马上删除数据:item=", key) self.__map.pop(key) if __name__ == '__main__': m = Message() print("=====设置数据======") m["百度"] = "www.baidu.com" print("=====查询获取======") print(m["百度"]) print("=====获取个数======") print("获取元素个数:", len(m)) print("=====删除======") del m["百度"] """ =====设置数据====== 【set item】设置数据:key=百度, value=www.baidu.com =====查询获取====== 【get item】获取数据:item= 百度 www.baidu.com =====获取个数====== 获取元素个数: 1 =====删除====== 【del item】马上删除数据:item= 百度 """