调用拦截功能

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

Python入门-面向对象-特殊方法的更多相关文章

  1. Python入门 - 面向对象

    python很好的支持面向对象编程,本节主讲类的定义,类的构造方法,类的继承与方法重写,类的多继承. 一.类的定义 class Myclass() : def prt(self, str) : pri ...

  2. Python之面向对象:方法

    一.类的三种方法 1.实例方法 def func(self): 由对象调用:至少一个self参数:执行普通方法时,自动将调用该方法的对象赋值给self: 只能通过实例调用   2.静态方法 @stat ...

  3. Python入门之format()方法

    在此列出format()方法的一些基本使用: >>> '{}{}{}'.format('圆周率是',3.1415926,'...') '圆周率是3.1415926...' >& ...

  4. Python入门-面向对象-装饰器

    1.变量作用域 全局变量和局部变量 #变量是有作用域的,分为全局变量和局部变量 num = 100 #这是全局变量 def change(): """ 查看变量作用域 & ...

  5. Python入门-面向对象三大特性-封装

    一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 从某处调用被封装的内容 第一步:将内容封装到某处 sel ...

  6. Python入门-面向对象三大特性-多态

    Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型".

  7. Python入门-面向对象三大特性-继承

    面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容. 例如: 猫可以:喵喵叫.吃.喝.拉.撒 狗可以:汪汪叫.吃.喝.拉.撒 如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实 ...

  8. Python入门之面向对象的__init__和__new__方法

    Python入门之面向对象的__init__和__new__方法

  9. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

随机推荐

  1. nginx 访问php文件报错

    问题图: An error occurred. 解决方法(windows版) php.cgi没有启动 cmd中找到cig.exe 的位置然后运行   php-cgi.exe -b 127.0.0.1: ...

  2. pandas常用操作详解——.loc与.iloc函数的使用及区别

    loc与iloc功能介绍:数据切片.通过索引来提取数据集中相应的行数据or列数据(可以是多行or多列) 总结: 不同:1. loc函数通过调用index名称的具体值来取数据2. iloc函数通过行序号 ...

  3. pycharm实用常用快捷键

    我们在实用pycharm时候,可以使用一些快捷键来帮助我们写代码. 1 alt + enter 快速导包,在需要导入包时候可以使用这个快捷键: 2 alt + 1 可以快速打开或者关闭左侧projec ...

  4. Java的jstack命令使用详解

    jstack命令简介 jstack(Java Virtual Machine Stack Trace)是JDK提供的一个可以生成Java虚拟机当前时刻的线程快照信息的命令行工具.线程快照一般被称为th ...

  5. Python函数-5 生成器

    生成器有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的.比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表 ...

  6. java-关于java

    JavaSE(标准版) JavaME(嵌入式)(淘汰) JavaEE(E企业级开发) JavaSE是基础 API端口 JDK Java开发工具 JRE Java运行时环境 JVM 虚拟机 可以在软件和 ...

  7. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  8. springboot项目yml中使用中文注释报错的解决方法1

    启动springboot项目时报错:/application.yml.....这大致就是说application.yml有问题,那么目前我所知道的大致两种情况会报错,第一种是yml格式有问题,要注意缩 ...

  9. Java 中用到的线程调度算法是什么?

    计算机通常只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获得 CPU 的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线 程轮流获得 CPU 的使用权,分别执行各自 ...

  10. 为什么我们调用 start()方法时会执行 run()方法,为什么 我们不能直接调用 run()方法?

    当你调用 start()方法时你将创建新的线程,并且执行在 run()方法里的代码. 但是如果你直接调用 run()方法,它不会创建新的线程也不会执行调用线程的代码, 只会把 run 方法当作普通方法 ...