内置函数补充,__str__方法、__del__方法 和 __call__方法和元祖
一 、内置函数补充 1.isinstance函数:
isinstance(obj,cls)检查obj是否是类 cls 的对象
使用该函数来判断一个函数的类型 2. issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo) 二、反射
通过字符串来操作类与对象的属性,这种操作称为反射
class People:
country="China"
def __init__(self,name):
self.name=name
def tell(self):
print('%s is aaa' %self.name) obj=People('egon')
1、hasattr #检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'country'))
print(hasattr(obj,'tell')) 2、getattr #获取对应的属性
f=getattr(obj,'tell',None) # None为没有对应属性是的默认返回值
print(f == obj.tell)
f()
obj.tell() 3、setattr #设置属性等同修改操作
obj.age=18
setattr(obj,"age",18)
print(obj.__dict__) 4、delattr #删除属性
del obj.name
delattr(obj,"name")
print(obj.__dict__) 三、__str__方法、__del__方法 和 __call__方法 1. __str__是系统默认函数,在打印对象时自动触发函数执行 class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def __str__(self):
# print('========>')
return '<名字:%s 年龄:%s 性别:%s>' %(self.name,self.age,self.sex) obj=People('egon',18,'male')
print(obj)
2. __del__也是系统默认函数在程序结束时,对象被删除的条件下,自动执行。
注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的
对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开
一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源3,这就用到了__del__。 实际使用示例:
class MyOpen:
def __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)
return msg def __del__(self):
self.fobj.close() #此时在清除对象之前自动执行归还系统资源 res=f.fobj.read()
print(res) 3.__call__ :对象后面加括号,触发执行。
构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__
方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
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() obj(1,2,3,a=1,b=2,c=3) 四、元类 1. 一切皆为对象:
元类:类的类就是元类,
我们用class定义的类使用来产生我们自己的对象的
内置元类type是用来专门产生class定义的类的 2、用内置的元类type,来实例化得到我们的类
class_name='Chinese'
class_bases=(object,)
class_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)
# 类的三大要素class_name,class_bases,class_dic 3 、自定义元类: 自己可以控制类规范
class Mymeta(type):
# 来控制类Foo的创建
def __init__(self,class_name,class_bases,class_dic): #self=Foo
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={}
#1 造一个空对象obj
obj=object.__new__(self)
#2、调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__
self.__init__(obj,*args,**kwargs)
return obj # 下一行等同于传值 Foo=Mymeta('Foo',(object,),class_dic)
class Foo(object,metaclass=Mymeta):
"""
文档注释
"""
x=1
def __init__(self,y):
self.Y=y def f1(self):
print('from f1') obj=Foo(1111) #Foo.__call__() 5.单例模式:适用于值重复不会改变,可节省一定资源 方式一、
import settings class MySQL:
__instance=None
def __init__(self,ip,port):
self.ip=ip
self.port=port @classmethod
def singleton(cls):
if not cls.__instance:
obj=cls(settings.IP, settings.PORT)
cls.__instance=obj
return cls.__instance obj4=MySQL.singleton()
obj5=MySQL.singleton()
obj6=MySQL.singleton() print(obj4 is obj5 is obj6)
内置函数补充,__str__方法、__del__方法 和 __call__方法和元祖的更多相关文章
- 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块
1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...
- python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法
一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstan ...
- python 之 面向对象(多态性、装饰器方法 内置函数补充)
7.6 多态性 1 什么是多态性 多态指的是同一种事物多种形态,在程序中用继承可以表现出多态.多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法 2.为什要用多态 用基类创建一套统一的规 ...
- Python开发基础-Day11内置函数补充、匿名函数、递归函数
内置函数补充 python divmod()函数:把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) 语法: divmod(a, b) #a.b为数字,a为除数,b ...
- 自学Python3.3-函数分类(内置函数补充)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- Python之路----内置函数补充与匿名函数
内置函数补充:reversed()保留原列表,返回一个反向的迭代器 l = [1,2,3,4,5] l.reverse() print(l) l = [1,2,3,4,5] l2 = reversed ...
- 《Python》 内置函数补充、匿名函数、递归初识
一.内置函数补充: 1.数据结构相关(24): 列表和元祖(2):list.tuple list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素). tuple:将一个可迭代对象转 ...
- Day4 内置函数补充、装饰器
li = [11,22,33,44]def f1(arg): arg.append(55)#函数默认返回值None,函数参数传递的是引用li = f1(li) print(li) 内置函数补充: ...
- python学习笔记:第14天 内置函数补充和递归
一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...
随机推荐
- 安装一个apk文件源代码
/** * 安装一个apk文件 * * @param file * 要安装的完整文件名 */ protected void installApk(File file) { ...
- 【个人训练】(POJ1837)Balance
这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索.dp.图论.这几天的题目应该就是这些范围. 题意 原题的意思大概是这样的, ...
- 初探Qt Opengl【1】
最近一直在学习Qt的opengl绘图,看到好多资源都是关于以前的旧版本的, 我将我这几天学的的部分关于opengl的做个总结,也希望对需要学习的人有一定的帮助 在我的学习中,我主要用到一下三个方法 # ...
- 使用CodeBlocks编译64位程序(用的编译器仅仅是windows sdk的)
需求: -CodeBlocks使用nightly版本: -Windows SDK(我使用的是6.0A,即微软针对vista的,因为这个比较小,你也可以选择其他版本但是要有64位编译器.他也适用于xps ...
- 轻量级权限管理系统——MVC基础
Microsoft Web 开发平台
- MapReduce 并行编程理论基础
对于mapreduce这一并行计算模型,一直以来都不是很清楚其具体的执行细节,今天看了学院一位老师的实验指导书,对这一过程有了一个初步的理解,特别是map阶段和reduce阶段,所以做了一份笔记,现在 ...
- 【WebService】——阶段小结
[概念] WebService集中解决了远程调用.跨平台和跨语言的问题.如下图中,A应用与B应用之间的相互调用不再局限于平台(Linux或Windows).语言(Java和C#). [与xml] 提到 ...
- 在es中用scroll查询与completableFuture
一般而言,es返回数据的上限是10000条,如果超过这个数量,就必须使用scroll查询. 所谓scroll查询就类似DBMS中的游标,或者快照吧,利用查询条件,在第一次查询时,在所有的结果上形成了一 ...
- combobox下拉框
----------------------------------------------combobox下拉框----------------------------------------- f ...
- [USACO07DEC]美食的食草动物Gourmet Grazers
---题面--- 题解: 首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛. 实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于 ...