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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
Python中的日期时间处理详解
Nov 17 Python
python决策树之CART分类回归树详解
Dec 20 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
python 读取txt中每行数据,并且保存到excel中的实例
Apr 29 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
Python headers请求头如何实现快速添加
Nov 03 Python
python 模拟在天空中放风筝的示例代码
Apr 21 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
很好用的PHP数据库类
2009/05/27 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
prototype Element学习笔记(篇二)
2008/10/26 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
js动态引入的四种方法
2018/05/05 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python获取网页上图片下载地址的方法
2015/03/11 Python
windows下ipython的安装与使用详解
2016/10/20 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
解决c++调用python中文乱码问题
2020/07/29 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
HTML5之语义标签介绍
2016/07/07 HTML / CSS
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
财务管理专业应届毕业生求职信
2013/09/22 职场文书
初一地理教学反思
2014/01/16 职场文书
出国考察邀请函
2014/01/21 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
乐山大佛导游词
2015/02/02 职场文书
医生辞职信范文
2015/03/02 职场文书
Django如何与Ajax交互
2021/04/29 Python