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实现图片批量剪切示例
Mar 25 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
Python使用turtule画五角星的方法
Jul 09 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
Aug 02 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
如何通过python画loss曲线的方法
Jun 26 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
Python基础知识学习之类的继承
May 31 Python
PyTorch中permute的使用方法
Apr 26 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安装攻略:常见问题解答(一)
2006/10/09 PHP
让你的网站首页自动选择语言转跳
2006/12/06 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
js实现轮播图特效
2020/05/28 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
简单介绍Ruby中的CGI编程
2015/04/10 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
详解python的super()的作用和原理
2020/10/29 Python
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
毕业生自我鉴定
2013/12/04 职场文书
四风存在的原因分析
2014/02/11 职场文书
主持人演讲稿
2014/05/13 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
求职导师推荐信范文
2015/03/27 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
初中数学教学随笔
2015/08/15 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
Pytest中skip skipif跳过用例详解
2021/06/30 Python