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= 百度
"""

 

posted @ 2021-08-20 11:13  zwx901323  阅读(70)  评论(0)    收藏  举报