Day 22 Object_oriented_programming 3

isinstance(obj,cls)和issubclass(sub,super)

isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True

1 class Foo(object):
2     pass
3 obj = Foo()
4 print(isinstance(obj, Foo))

issubclass(sub, super)检查sub类是否是 super 类的派生类,如果是返回True

1 class Foo(object):
2     pass
3 class Bar(Foo):
4     pass
5 issubclass(Bar, Foo)

反射

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

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

示例代码:

1 class Teacher:
2     school=‘jialidun‘
3     def __init__(self,name,age):
4         self.name=name
5         self.age=age
6     def teach(self):
7         print(‘%s teach‘ %self.name)

通过字符串的方式判断是否存在一个属性:

1 t=Teacher(‘bob‘,18)
2 print(hasattr(Teacher,‘name‘))  #False
3 print(hasattr(Teacher,‘school‘))    #True
4 print(hasattr(Teacher,‘teach‘))     #True
5 print(hasattr(t,‘name‘))  #True
6 print(hasattr(t,‘school‘))    #True
7 print(hasattr(t,‘teach‘))     #True

通过字符串的方式获取一个属性:

1 print(getattr(Teacher,‘school‘))    #获取到则返回属性的值
2 print(getattr(Teacher,‘sdfad‘,None))    #获取不到返回None,如果不指定None那么抛出异常错误

通过字符串的方式设定一个属性:

1 setattr(Teacher,‘sex‘,‘male‘)    #设定Teacher类的属性sex=‘male‘
2 setattr(t,‘sex‘,‘female‘)    #设定对象t对象的属性sex=‘female‘
3 print(Teacher.__dict__)
4 print(t.__dict__)

通过字符串的方式删除一个属性:

1 delattr(Teacher,‘sex‘)
2 delattr(t,‘sex‘)

反射应用场景:用户交互

 1 class Cmd:
 2     def __init__(self,name):
 3         self.name=name
 4     def run(self):
 5         while True:
 6             cmd=input(‘>>>‘).strip()
 7             if not cmd:continue
 8             if hasattr(self,cmd):    #判断这个类包含不包含输入的属性
 9                 func=getattr(self,cmd)    #如果包含,获取该属性
10                 func()    #执行该属性(输入name会抛错提示字符串不能被调用,因为name是一个数据属性,而非函数属性)
11             else:
12                 print(‘not valid func‘)
13     def ls(self):
14         print(‘ls function‘)
15     def pwd(self):
16         print(‘pwd function‘)
17     def cat(self):
18         print(‘cat function‘)
19 c=Cmd(‘bob‘)
20 c.run()

反射的好处

实现可插拔机制:可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,即可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

动态导入模块:基于反射当前模块成员

__str__方法

改变对象的字符串显示

 1 class Teacher:
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5 t=Teacher(‘bob‘,18)
 6 print(t)
 7 输出结果
 8 <__main__.Teacher object at 0x0000020FC4DA9278>
 9
10 #########分割线君###########
11
12 class Teacher:
13     def __init__(self,name,age):
14         self.name=name
15         self.age=age
16     def __str__(self):
17         return ‘<name:%s age:%s>‘ % (self.name, self.age)
18 t=Teacher(‘bob‘,18)
19 print(t)    #t.__str__()
20 输出结果:类中的__str__函数的执行结果
21 <name:bob age:18>

__del__方法

在程序执行完了之后会自动执行的内容

 1 class Foo:
 2     def __init__(self,x):
 3         self.x=x
 4     def __del__(self):
 5         print(‘执行__del__‘)
 6         ‘‘‘一般用来做一些关于对象执行完了之后剩下的垃圾的清理操作‘‘‘
 7 f=Foo(10)
 8 print(‘执行完了‘)
 9
10 输出结果:先执行最后的print,没有代码了执行__del__函数
11 执行完了
12 执行__del__

删除对象后立即执行的内容

 1 class Foo:
 2     def __init__(self,x):
 3         self.x=x
 4     def __del__(self):
 5         print(‘执行__del__‘)
 6         ‘‘‘做一些关于对象的清理操作‘‘‘
 7 f=Foo(10)
 8 del f     #删除的时候也会执行del内容
 9 print(‘执行完了‘)
10
11 输出结果:删除了f对象后执行了__del__后才执行最后的print
12 执行__del__
13 执行完了

item系列

以中括号的方式进行处理类似于:

1 l=[‘a‘,‘b‘,‘c‘]
2 dic={‘a‘:1}
3 print(l[1])
4 print(dic[‘a‘])

__getitem__、__setitem__、__delitem__

 1 class Teacher:
 2     def __init__(self,name,age,sex):
 3         self.name=name
 4         self.age=age
 5         self.sex=sex
 6     def __getitem__(self, item):    #查询
 7         # return getattr(self,item)
 8         return self.__dict__[item]
 9     def __setitem__(self, key, value):    #设置
10         # setattr(self,key,value)
11         self.__dict__[key]=value
12     def __delitem__(self, key):    #删除
13         # delattr(self,key)
14         self.__dict__.pop(key)
15 f=Teacher(‘bob‘,18,‘male‘)
16 print(f.name) #f[‘name‘]
17 print(f[‘name‘])    #查询
18 f[‘name‘]=‘bob_nb‘    #设置
19 print(f.__dict__)
20 del f[‘name‘]    #删除
21 print(f.__dict__)

__len__方法

给对象提供len()统计方法

1 class Teacher:
2     def __init__(self,name,age,sex):
3         self.name=name
4         self.age=age
5         self.sex=sex
6     def __len__(self):    #长度设置为10
7         return 10
8 f=Teacher(‘bob‘,18,‘male‘)
9 print(len(f))    #输出10

其他方法(补充)

__setattr__,__delattr__,__getattr__方法

 1 class Foo:
 2     x=1
 3     def __init__(self,y):
 4         self.y=y
 5     def __getattr__(self, item):
 6         print(‘----> from getattr:你找的属性不存在‘)
 7     def __setattr__(self, key, value):  #限制赋值,无法对属性直接赋值,必须要对__dict__进行操作赋值
 8         print(‘----> from setattr‘)
 9         # self.key=value #这就无限递归了,任何赋值操作都会调用__setattr__的运行,所以....
10         # self.__dict__[key]=value #应该使用这种方式,操作字典可以赋值成功
11     def __delattr__(self, item):
12         print(‘----> from delattr‘)
13         # del self.item #无限递归了,同__setattr__方法的无限递归
14         self.__dict__.pop(item)
15 #__setattr__添加/修改属性会触发它的执行
16 f1=Foo(10)
17 f1.__setattr__(‘a‘,1)   #不是直接操作字典,无法赋值
18 print(f1.__dict__) # 因为重写了__setattr__,凡是赋值操作都会触发它的运行,什么都不写,就是根本没赋值,除非直接操作属性字典,否则永远无法赋值
19 f1.z=3
20 print(f1.__dict__)
21 #__delattr__删除属性的时候会触发
22 f1.__dict__[‘a‘]=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
23 del f1.a    #删除的时候如果上面函数是del self.item,会无限递归
24 print(f1.__dict__)
25
26 #__getattr__只有在使用点调用属性且属性不存在的时候才会触发
27 f1.xxxxxx

包装(对标准数据类型进行方法修改)

通过继承和派生的方式,进行修改源生数据类型的方法

 1 class List(list): #继承list所有的属性,也可以派生出自己新的,比如append和mid
 2     def append(self, p_object):
 3         ‘派生自己的append:加上类型检查‘
 4         if not isinstance(p_object,int):
 5             raise TypeError(‘must be int‘)
 6         super().append(p_object)
 7     @property
 8     def mid(self):
 9         ‘新增自己的属性‘
10         index=len(self)//2
11         return self[index]

时间: 2024-11-01 14:35:24

Day 22 Object_oriented_programming 3的相关文章

Up to 8% free bonus for runescape 2007 gp on Rsorder as july best gift&Enjoy Telos During 7.1-7.22

Now, a small band of freedom fighters struggle to end the osrs gold  long, dark night of Daein's oppression. The big blog news of the day is that Vox Media has acquired Curbed Network. As an amulet you should be wearing an amulet of glory and if you

2016/2/22 三级导航

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="

22.Android 十分方便的滑动标签页

22.Android 十分方便的滑动标签页 Android 十分方便的滑动标签页 前言 EasySlidingTabs属性 EasySlidingTabs布局 FragmentPagerAdapter EasySlidingTabs设置Tab背景 Github传送门 效果图 前言 其实滑动标签页是很常见的,网上搜也是一大堆.但是好用.简单.少bug.可扩展的库实在不多.很多想在做滑动标签页的时候也是经常想到各种不靠谱的库,虽然不难,但是容易坑自己. 原三星底层App大神JiangEcho提供技术

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三)

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及PeerSync策略.本文以及后续的文章将重点介绍Replication策略.Replication策略不但可以在SolrCloud中起到leader到replica的数据同步,也可以在用多个单独的Solr来实现主从同步.本文先介绍在SolrCloud的leader到replica的数据同步,下一篇

2014年4月23日 10:22:08

step 1 : 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要直接根据字节流和协议来生成自己的数据对象. 按照之前的编程思维,总是请求然后响应,当然Socket也是请求和响应,不过与单纯的请求响应是不同的. 这里Socket连接往往是要保持住的,也就是长连接,然后设置一个缓冲区,网络流不断的追加到缓冲区.然后后台去解析缓冲区的字节流. http://cuisuqiang.iteye.com/blog/

22岁的这一年

时间流逝,昨日的22仿佛就像幻想般消失,再也回不去,只留下这记述的文字和慢慢模糊不清的记忆,给予追悔的冲动,奋发的思想.   三年前到佛山,为了那崇拜已久的神奇,为了那心中充满的兴趣踏上学习路,那时间可谓充实,真正把时间安排的井井有条,白天要工作,晚上要学习,要敲代码,有付出有收获,苦过,累过..人生就是这样一点一点起步的,没有完美,途中总有跌倒.失败.成功的时候, 往往在跌倒.失败的时候才有刻骨铭心的教诲,成功只是证明自己在失败中真正学到的东西,活着总要学会不断的失败,从失败中学习成长;在某一

横向受荷桩的设计软件 Oasys Alp 19.2.0.22

Oasys Alp 19.2.0.22 1CD 分析横向受力桩的土-结构相互作用的简易方法 当谈到横向受荷桩的设计软件,ALP使事情简单.这种横向受力桩分析软件模型的土壤剪切破坏和非线性的土壤行为,计算挠度下降的桩一起弯矩和剪力桩内. 选择选项,以适应任何打桩工程 桩的位移和位移 Acme CAD Converter 2016 8.7.5.1456 Portable 1CD  Bentley HAMMER CONNECT Edition 10.00.00.49 1CD  Bentley Wate

益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18

热增益计算Shprotification.v6.8.15.22+Heat.Balance.v6.12.27.36+Cold.Balance.v2.6.14.18 Andrey.Shirshov.Shprotification.v6.8.15.22 Andrey.Shirshov.Heat.Balance.v6.12.27.36 Andrey.Shirshov.Cold.Balance.v2.6.14.18   "现代ASHRAE标准参考数据用于从人.设备.确定热输入的人工照明,半透明的击剑系数(

[051] 微信公众平台开发教程第22篇-如何保证access_token长期有效

为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证. access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口获取access_token.在理想情况下,一个7x24小时运行的系统,每天只需