一、内置函数补充

1、isinstance(obj,cls)检查是否obj是否是类 cls 的对象

classFoo(object):passobj=Foo()print(isinstance(obj, Foo)) #结果为True

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

classFoo(object):pass

classBar(Foo):pass

print(issubclass(Bar, Foo)) #结果为True

二、 反射

1 、什么是反射

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

2 、python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数:

hasattr、getattr、setattr、delattr

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

#1、hasattr#print(hasattr(People,'country')) #True#print('country' in People.__dict__) #不知道hasattr方法时,用的方法#print(hasattr(obj,'name')) #True#print(hasattr(obj,'country')) #True#print(hasattr(obj,'tell')) #True

#2、getattr#x=getattr(People,'country1',None) #查找指定属性,没有此属性(提前预防报错写None)显示None,有就返回值#print(x)

#f=getattr(obj,'tell',None)#obj.tell#print(f == obj.tell) #True#f() #正常的调用函数#obj.tell()

#3、setattr#People.x=111#setattr(People,'x',111) #添加x属性,值为111#print(People.x)

#obj.age=18#setattr(obj,"age",18) # 添加age属性,值为18#print(obj.__dict__)

#4、delattr#del People.country #原始的方法#delattr(People,"country")#print(People.__dict__)

#del obj.name#delattr(obj,"name")#print(obj.__dict__)

三、__str__

classPeople:def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sexdef __str__(self):#print('========>')

return '' %(self.name,self.age,self.sex)

obj=People('duoduo',18,'male')print(obj) #print(obj.__str__()) 在print时触发__str__

四、 __del__

当对象在内存中被释放时,自动触发执行。

注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源

importtimeclassPeople:def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sexdef __del__(self): #在对象被删除的条件下,自动执行

print('__del__')

obj=People('duoduo',18,'male')#del obj #obj.__del__() #先删除的情况下,直接执行__del__

time.sleep(5) #可以更形象的看出在资源回收前执行__del__

典型的应用场景:

创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中

当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源

这与文件处理是一个道理:

f=open('a.txt') #做了两件事,在用户空间拿到一个f变量,在操作系统内核空间打开一个文件

del f #只回收用户空间的f,操作系统的文件还处于打开状态#所以我们应该在del f之前保证f.close()执行,即便是没有del,程序执行完毕也会自动del清理资源,于是文件操作的正确用法应该是

f=open('a.txt')

读写...

f.close()

#很多情况下大家都容易忽略f.close,这就用到了with上下文管理classMyOpen: #自己写个打开读文件类,封装内置的opendef __init__(self,filepath,mode="r",encoding="utf-8"):

self.filepath=filepath

self.mode=mode

self.encoding=encoding

self.fobj=open(filepath,mode=mode,encoding=encoding) #申请系统内存def __str__(self):

msg="""filepath:%s

mode:%s

encoding:%s""" %(self.filepath,self.mode,self.encoding)returnmsgdef __del__(self):

self.fobj.close()f=MyOpen('aaa.py',mode='r',encoding='utf-8')#print(f.filepath,f.mode,f.encoding)#print(f)

#print(f.fobj)

res=f.fobj.read() #一样可以读

print(res)

五、exec

#例子 一

code="""#global x #shsh声明x为全局变量

x=0

y=2"""global_dic={'x':100000}

local_dic={} #字符串中声明全局就是全局,不声明就是局部

exec(code,global_dic,local_dic)#

#print(global_dic)#print(local_dic)

#例子 二#code="""#x=1#y=2#def f1(self,a,b):#pass#"""#local_dic={}#exec(code,{},local_dic)#print(local_dic)

六、元类

1、什么是元类:

类的类就是元类

#我们用class定义的类使用来产生我们自己的对象的

#内置元类type是用来专门产生class定义的类的

#一切皆为对象:#Chinese=type(...)

classChinese:

country="China"

def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sexdefspeak(self):print('%s speak Chinese' %self.name)#print(Chinese)#p=Chinese('duoduo',18,'male')#print(type(p)) #最上层的类 type

#print(type(Chinese))

2、用内置的元类type,来实例化得到我们的类

#2、用内置的元类type,来实例化得到我们的类

class_name='Chinese'class_bases=(object,)

lass_body="""country="China"

def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sex

def speak(self):

print('%s speak Chinese' %self.name)"""class_dic={}exec(class_body,{},class_dic)#类的三大要素#print(class_name,class_bases,class_dic)

Chinese=type(class_name,class_bases,class_dic)#print(Chinese)

p=Chinese('duoduo',18,'male')#print(p.name,p.age,p.sex)

3、 __call__

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

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

classFoo:def __init__(self):pass

def __str__(self):return '123123'

def __del__(self):pass

#调用对象,则会自动触发对象下的绑定方法__call__的执行,

#然后将对象本身当作第一个参数传给self,将调用对象时括号内的值

#传给*args与**kwargs

def __call__(self, *args, **kwargs):print('__call__',args,kwargs)

obj=Foo()#print(obj)

obj(1,2,3,a=1,b=2,c=3) #

4、自定义元类

classMymeta(type):#来控制类Foo的创建

def __init__(self,class_name,class_bases,class_dic): #self=Foo

#print(class_name)

#print(class_bases)

#print(class_dic)

if not class_name.istitle(): #加上判断

raise TypeError('类名的首字母必须大写')if not class_dic.get('__doc__'):raise TypeError('类中必须写好文档注释')

super(Mymeta,self).__init__(class_name,class_bases,class_dic)#控制类Foo的调用过程,即控制实例化Foo的过程

def __call__(self, *args, **kwargs): #self=Foo,args=(1111,) kwargs={}

#print(self)

#print(args)

#print(kwargs)

#1 造一个空对象obj

obj=object.__new__(self)#2、调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__

self.__init__(obj,*args,**kwargs)returnobj#Foo=Mymeta('Foo',(object,),class_dic)

class Foo(object,metaclass=Mymeta):"""文档注释"""x=1

def __init__(self,y):

self.Y=ydeff1(self):print('from f1')

obj=Foo(1111) #Foo.__call__()

#print(obj)#print(obj.y)#print(obj.f1)#print(obj.x)

5、单例模式

import settings #调用配置文件的IP,PORT

classMySQL:__instance=Nonedef __init__(self,ip,port):

self.ip=ip

self.port=port

@classmethod #绑定方法defsingleton(cls):if not cls.__instance:

obj=cls(settings.IP, settings.PORT)

cls.__instance=objreturn cls.__instanceobj1=MySQL('1.1.1.2',3306)

obj2=MySQL('1.1.1.3',3307)

obj3=MySQL('1.1.1.4',3308)#obj4=MySQL(settings.IP,settings.PORT)#print(obj4.ip,obj4.port)

obj4=MySQL.singleton()

obj5=MySQL.singleton()

obj6=MySQL.singleton()print(obj4 is obj5 is obj6) #Ture

delstr函数python_python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法详解...相关推荐

  1. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  2. Day05:装饰器,三元表达式,函数的递归,匿名/内置函数,迭代器,模块,开发目录...

    上节课复习: 1.函数的对象     函数可以被当作数据取处理 2.函数嵌套     嵌套调用:在调用一个函数时,函数体代码又调用了其他函数     嵌套定义:在一个函数内部又定义了另一个函数 1 d ...

  3. python语言接收信息的内置函数_python接收信息的内置函数是

    有的python内置函数怎么就一个pass这个模块是用C实现的,没有Python源码. 所以python代码中只有一个pass,因为代码中都是C实现的. 两种情况: 一种情况是继承的时候会用到的,父类 ...

  4. python内置函数返回元素个数_Python内置函数

    Python Python开发 Python语言 Python内置函数 Python内置函数 一.内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print, inp ...

  5. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  6. 让python飞:形象理解python 全局变量、局部变量、内部函数、外部函数、ascii码、内置函数

    Day06凯尔特与佛印闯双蛇洞 秦始皇得知有一兵马俑逃脱,立即派出大内高手凯尔特前去捉拿.凯尔特一路追踪到熊山寺,但寺门紧闭,遂从后门入寺. 凯尔特悄悄溜到后山,见到高台周围有许多狮子蠢蠢欲睡.高台上 ...

  7. python内置的读取文件函数_Python函数篇(3)-内置函数、文件处理(已更新)

    1.内置函数 上一篇文章中,我重点写了reduce.map.filter3个内置函数,在本篇章节中,会补充其他的一些常规内置函数,并重点写max,min函数,其他没有说明的函数,会在后面写到类和面向对 ...

  8. python常用内置函数总结-python常见的内置函数

    函数分为自定义函数和内置函数 python内置函数分类: 一.强制转换 int() / str() / bool() / list() / tuple() / dict() / set() 二.输入输 ...

  9. python中f点flush是什么函数_Python文件操作及内置函数flush原理解析

    1.打开文件得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 示例文件 '你好呀' 我是于超 嗯 再见 文件操作基本流程 f=open('chenli',encoding='ut ...

最新文章

  1. 艾宾浩斯计划表自动生成网站_施工进度计划表横道图,自动出图超方便,建议收藏...
  2. java中遍历map的几种方法介绍
  3. CSS基础(part17)--vertical-align垂直对齐
  4. eclipse maven访问maven私有库
  5. Linux Shell编程之脚本执行方式
  6. HTML5 Web Worker的使用
  7. 构建根文件系统之启动第一个程序(韦大仙)
  8. php判断ie的内核,js判断浏览器版本以及浏览器内核的方法_javascript技巧
  9. Unity3D中把AudioClip保存为Wav文件
  10. 那一年,创业 vs 阿里(下):阿里篇
  11. bat脚本一键配置java开发环境
  12. 利用Java计算经纬度距离工具类
  13. 机器学习原理与实践(开源图书)-总目录
  14. 【LinuxOS】Ubuntu学习感悟
  15. 【解决办法】Dell AWCC应用程序不兼容超频不可用
  16. 信管大学计算机操作系统考试试题,武汉理工大学信管操作系统模拟试题及参考答案...
  17. FastDFS 入门小 Demo( 图片上传)
  18. Java知识点(三)
  19. QlikView介绍
  20. 论文阅读 Safe Local Exploration for Replanning in Cluttered Unknown Environments

热门文章

  1. 计算一段代码执行完毕用时问题
  2. Coding-Job:从研发到生产的容器化融合实践
  3. Sql server 2005 中的dense_rank()函数的应用
  4. OJ1160: 矩阵的最大值(指针专题)(C语言)
  5. 扩散(信息学奥赛一本通-T1437)
  6. 序列中最大的数(51Nod-1062)
  7. 6 只能在公司代码xxxx的期间2020/08和2020/07中记账
  8. linux jobs继续运行,Linux jobs等前后台运行命令详解
  9. 降维:用 PCA 压缩数据集
  10. matlab遗传算法实例crtrp,遗传算法求解实例