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简单网络编程示例【客户端与服务端】
May 26 Python
Python 多核并行计算的示例代码
Nov 07 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
python getpass模块用法及实例详解
Oct 07 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 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
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
再谈javascript原型继承
2014/11/10 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
python 实现简单的FTP程序
2019/12/27 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
python 下载文件的多种方法汇总
2020/11/17 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
七一表彰活动方案
2014/01/18 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
求职信标题怎么写
2014/05/26 职场文书
2015年新农合工作总结
2015/03/30 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android