Python反射和内置方法重写操作详解


Posted in Python onAugust 27, 2018

本文实例讲述了Python反射和内置方法重写操作。分享给大家供大家参考,具体如下:

isinstance和issubclass

isinstance(obj,cls)检查是否obj是否是类 cls 的对象,类似 type()

class Foo(object):
  pass
obj = Foo()
isinstance(obj, Foo)

issubclass(sub, super)检查sub类是否是 super 类的派生类

class Foo(object):
 pass
class Bar(Foo):
 pass
issubclass(Bar, Foo)

反射

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

四个反射函数

hasattr(obj,str)
检测是否含有某属性

getattr(obj,str)
获取属性,不存在报错

setattr(obj,str,value)
设置属性

delattr(obj,str)
删除属性,不存在报错

导入其他模块,利用反射查找该模块是否存在某个方法

def test():
 print('from the test')

item系列

__getitem__\__setitem__\__delitem__

class Foo:
 def __init__(self,name):
  self.name=name
 def __getitem__(self, item):
  print(self.__dict__[item])
 def __setitem__(self, key, value):
  self.__dict__[key]=value
 def __delitem__(self, key):
  print('del obj[key]时,我执行')
  self.__dict__.pop(key)
 def __delattr__(self, item):
  print('del obj.key时,我执行')
  self.__dict__.pop(item)
f1=Foo('sb')
f1['age']=18
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)

运行结果:

del obj.key时,我执行
del obj[key]时,我执行
{'name': 'alex'}

__new__

class A:
 def __init__(self):
  self.x = 1
  print('in init function')
 def __new__(cls, *args, **kwargs):
  print('in new function')
  return object.__new__(A, *args, **kwargs)
a = A()
print(a.x)

运行结果:

in new function
in init function
1

单例模式:

class A:
 def __new__(cls):
  if not hasattr(cls,'obj'):
   cls.obj = object.__new__(cls)
  return cls.obj
a = A()
b = A()
print(a is b)

运行结果:

True

__call__

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
 def __init__(self):
  pass
 def __call__(self, *args, **kwargs):
  print('__call__')
obj = Foo() # 执行 __init__
obj()  # 执行 __call__

运行输出:

__call__

__len__

class A:
 def __init__(self):
  self.a = 1
  self.b = 2
 def __len__(self):
  return len(self.__dict__)
a = A()
print(len(a))

运行结果:

2

__hash__

class A:
 def __init__(self):
  self.a = 1
  self.b = 2
 def __hash__(self):
  return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))

运行结果:

-1777982230

__eq__

class A:
 def __init__(self):
  self.a = 1
  self.b = 2
 def __eq__(self,obj):
  if self.a == obj.a and self.b == obj.b:
   return True
a = A()
b = A()
print(a == b)

运行结果:

True

合并名字性别一样的人:

class Person:
 def __init__(self,name,age,sex):
  self.name = name
  self.age = age
  self.sex = sex
 def __hash__(self):
  return hash(self.name+self.sex)
 def __eq__(self, other):
  if self.name == other.name and self.sex == other.sex:return True
p_lst = []
for i in range(84):
 p_lst.append(Person('egon',i,'male'))
print(p_lst)
print(set(p_lst))

运行结果:

[<__main__.Person object at 0x01425AB0>, <__main__.Person object at 0x01425AD0>, <__main__.Person object at 0x01425AF0>, <__main__.Person object at 0x01425910>, <__main__.Person object at 0x014258D0>, <__main__.Person object at 0x01425950>, <__main__.Person object at 0x01425970>, <__main__.Person object at 0x014259D0>, <__main__.Person object at 0x01425C70>, <__main__.Person object at 0x01425890>, <__main__.Person object at 0x01425B30>, <__main__.Person object at 0x01425BB0>, <__main__.Person object at 0x01425C30>, <__main__.Person object at 0x01429710>, <__main__.Person object at 0x01429730>, <__main__.Person object at 0x014298F0>, <__main__.Person object at 0x01429910>, <__main__.Person object at 0x01429930>, <__main__.Person object at 0x01429950>, <__main__.Person object at 0x01429970>, <__main__.Person object at 0x01429990>, <__main__.Person object at 0x014299B0>, <__main__.Person object at 0x014299D0>, <__main__.Person object at 0x014299F0>, <__main__.Person object at 0x01429A10>, <__main__.Person object at 0x01429A30>, <__main__.Person object at 0x01429A50>, <__main__.Person object at 0x01429A70>, <__main__.Person object at 0x01429A90>, <__main__.Person object at 0x01429AB0>, <__main__.Person object at 0x01429AD0>, <__main__.Person object at 0x01429AF0>, <__main__.Person object at 0x01429B10>, <__main__.Person object at 0x01429B30>, <__main__.Person object at 0x01429B50>, <__main__.Person object at 0x01429B70>, <__main__.Person object at 0x01429B90>, <__main__.Person object at 0x01429BB0>, <__main__.Person object at 0x01429BD0>, <__main__.Person object at 0x01429BF0>, <__main__.Person object at 0x01429C10>, <__main__.Person object at 0x01429C30>, <__main__.Person object at 0x01429C50>, <__main__.Person object at 0x01429C70>, <__main__.Person object at 0x01429C90>, <__main__.Person object at 0x01429CB0>, <__main__.Person object at 0x01429CD0>, <__main__.Person object at 0x01429CF0>, <__main__.Person object at 0x01429D10>, <__main__.Person object at 0x01429D30>, <__main__.Person object at 0x01429D50>, <__main__.Person object at 0x01429D70>, <__main__.Person object at 0x01429D90>, <__main__.Person object at 0x01429DB0>, <__main__.Person object at 0x01429DD0>, <__main__.Person object at 0x01429DF0>, <__main__.Person object at 0x01429E10>, <__main__.Person object at 0x01429E30>, <__main__.Person object at 0x01429E50>, <__main__.Person object at 0x01429E70>, <__main__.Person object at 0x01429E90>, <__main__.Person object at 0x01429EB0>, <__main__.Person object at 0x01429ED0>, <__main__.Person object at 0x01429EF0>, <__main__.Person object at 0x01429F10>, <__main__.Person object at 0x01429F30>, <__main__.Person object at 0x01429F50>, <__main__.Person object at 0x01429F70>, <__main__.Person object at 0x01429F90>, <__main__.Person object at 0x01429FB0>, <__main__.Person object at 0x01429FD0>, <__main__.Person object at 0x01429FF0>, <__main__.Person object at 0x01751030>, <__main__.Person object at 0x01751050>, <__main__.Person object at 0x01751070>, <__main__.Person object at 0x01751090>, <__main__.Person object at 0x017510B0>, <__main__.Person object at 0x017510D0>, <__main__.Person object at 0x017510F0>, <__main__.Person object at 0x01751110>, <__main__.Person object at 0x01751130>, <__main__.Person object at 0x01751150>, <__main__.Person object at 0x01751170>, <__main__.Person object at 0x01751190>]
{<__main__.Person object at 0x01425AB0>}

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
Python对象属性自动更新操作示例
Jun 15 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
Python----数据预处理代码实例
Mar 20 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Django models文件模型变更错误解决
May 11 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
Python使用matplotlib绘制随机漫步图
Aug 27 #Python
Python面向对象之继承和组合用法实例分析
Aug 27 #Python
Python干货:分享Python绘制六种可视化图表
Aug 27 #Python
python使用matplotlib库生成随机漫步图
Aug 27 #Python
Python面向对象之接口、抽象类与多态详解
Aug 27 #Python
python实现随机漫步算法
Aug 27 #Python
Python3随机漫步生成数据并绘制
Aug 27 #Python
You might like
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
js Event对象的5种坐标
2011/09/12 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python实现浪漫的烟花秀
2019/01/30 Python
django连接oracle时setting 配置方法
2019/08/29 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Python sorted排序方法如何实现
2020/03/31 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
数据库面试要点基本概念
2013/10/31 面试题
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
班级学习雷锋活动总结
2014/07/04 职场文书
大学生心理活动总结
2014/07/04 职场文书
工程索赔意向书
2014/08/30 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
SQL SERVER中的流程控制语句
2022/05/25 SQL Server