Python自动化开发 - 面向对象(二)
本节内容
1、isinstance(obj,cls)和issubclass(sub,super)
3、__setattr__,__delattr__,__getattr__
| 一、 isinstance(obj,cls)和issubclass(sub,super) | 
1、isinstance(obj,cls) 检查obj是否是类 cls 的对象
class Foo(object):
pass obj = Foo()
print(isinstance(obj, Foo)) # True
2、issubclass(sub, super) 检查sub类是否是 super 类的派生类
class Foo(object):
pass class Bar(Foo):
pass print(issubclass(Bar, Foo)) # 必须是类,而不是实例
| 二、反射 | 
1、反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
2、Python面向对象中的反射:通过字符串的形式操作对象相关的属性。Python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)。以object为例,同样适用于class
hasattr(object, name) # 判断object中有没有一个name字符串对应的方法或属性
getattr(object, name, None) # 获取object中name字符串对应的方法或属性,没有则返回None
setattr(object, name, value) # 设置object中name字符串对应的值,无name时,新增属性
delattr(oject, name) # 删除ojbect中name字符对应的方法或属性,无name时会报错
class BlackMedia(object):
feature = "business" def __init__(self, name, address):
self.name = name
self.address = address def sell_house(self):
print("我是黑中介[%s], 来买房吧!" % self.name) def rent_house(self):
print("我是黑中介[%s], 来租房吧!" % self.name) b1 = BlackMedia("华夏地产", "皇城边上") # 检测是否含有某属性
print(hasattr(b1, 'name')) # 其中 'name' 为字符串****
print(hasattr(b1, 'sell_house')) # True # 获取属性
n = getattr(b1, 'name')
print(n)
func = getattr(b1, 'rent_house')
print(func) # <bound method BlackMedia.rent_house of <__main__.BlackMedia object at 0x0000008F538344E0>>
func() # getattr(b1, 'aaaaa') 不存在就报错
print(getattr(b1, 'aaaa', '不存在')) # 设置属性
setattr(b1, 'sb', True)
setattr(b1, 'show_name', lambda self: self.name + '黑地产')
print(b1.__dict__)
print(b1.show_name(b1)) # 删除属性
delattr(b1, 'sb')
# delattr(b1, 'show_name11') 没有就报错
print(b1.__dict__)
四个方式使用示例
class Foo(object):
staticField = "old boy" def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' @staticmethod
def bar():
return 'bar' print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'func'))
print(getattr(Foo, 'bar'))
类也是对象
3、反射的好处
好处一: 可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’
class FtpClient:
'ftp客户端,但是还么有实现具体的功能'
def __init__(self,addr):
print('正在连接服务器[%s]' %addr)
self.addr=addr
程序员甲未实现功能
#from module import FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
func_get=getattr(f1,'get')
func_get()
else:
print('---->不存在此方法')
print('处理其他的逻辑') 不影响alex的代码编写
程序员乙预先调用甲的接口
好处二:动态导入模块(基于反射当前模块成员)

| 三、__setattr__,__delattr__,__getattr__ | 
class Foo:
x=1
def __init__(self,y):
self.y=y def __getattr__(self, item):
print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value):
print('----> from setattr')
# self.key=value #这就无限递归了,你好好想想
# self.__dict__[key]=value #应该使用它 def __delattr__(self, item):
print('----> from delattr')
# del self.item #无限递归了
self.__dict__.pop(item) #__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__) #__delattr__删除属性的时候会触发
f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__) #__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx 三者的用法演示
三者用法演示
Python自动化开发 - 面向对象(二)的更多相关文章
- Python自动化开发 - 面向对象(一)
		
本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...
 - python自动化开发学习 进程, 线程, 协程
		
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
 - python自动化开发学习 I/O多路复用
		
python自动化开发学习 I/O多路复用 一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...
 - python自动化开发-[第九天]-异常处理、进程
		
今日概要: 1.异常处理使用 2.进程 3.paramiko模块使用 一.异常处理 1.常见的错误异常 #错误异常一 print(a) #NameError #错误异常二 int('sdadsds') ...
 - Python自动化开发 - Django【基础篇】
		
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...
 - python自动化开发-[第六天]-常用模块、面向对象
		
今日概要: 1.常用模块 - os模块 - random模块 - shutil模块 - hashlib模块 - pickle/json模块 - shelve模块 - configparser模块 - ...
 - python自动化开发-[第八天]-面向对象高级篇与网络编程
		
今日概要: 一.面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) 2.__setattr__,__getattr__,__delattr__ 3.二 ...
 - python自动化开发-[第七天]-面向对象
		
今日概要: 1.继承 2.封装 3.多态与多态性 4.反射 5.绑定方法和非绑定方法 一.新式类和经典类的区别 大前提: 1.只有在python2中才分新式类和经典类,python3中统一都是新式类 ...
 - Python自动化开发 -进程、线程和协程(二)
		
本节内容 一.线程进程介绍 二. 线程 1.线程基本使用 (Threading) 2.线程锁(Lock.RLock) 3.信号量(Semaphore) 4.事件(event) 5.条件(Conditi ...
 
随机推荐
- 05. pt-diskstats
			
pt-diskstats --devices-regex=sda --interval=1 --iterations=3 --show-timestamps #ts device rd_s rd_av ...
 - snort学习笔记
			
Snort有三种工作模式:嗅探器.数据包记录器.网络入侵检测系统(ids). 嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上. 数据包记录器模式把数据包记录到硬盘上. 网络入侵检测模 ...
 - jQuery动画函数回调
			
$("#show").click(function () { //function 是显示完成之后的回调函数 $("p").show(2000,function ...
 - Date时间
			
var date_obj= new Date(); alert(date_obj.toLocaleString()) //2017/12/26 上午1:10:54 var date_obj2= new ...
 - Python之路(第十篇)迭代器协议、for循环机制、三元运算、列表解析式、生成器
			
一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 b为何要有迭代器? 对于序列类型:字符串.列表 ...
 - 美食类Web原型制作分享-Taste
			
Taste是国外知名的美食类网站,为人们提供丰富的美食菜单,帮助人们更好的享受美食带来的快乐.网站采用图文结合的排版方式,有固定顶部导航栏的交互功能等. 本原型由国产原型工具Mockplus和团队协作 ...
 - JS浏览器Session存取数据
			
vm.indexdata.indexId = id; vm.indexdata.indexName = name; var tempIndex = JSON.stringify(vm.indexdat ...
 - Linux下设置Apache支持Https服务
			
HTTPS的主要作用: 1)建立一个信息安全通道,来保证数据传输的安全性 2)确认网站的真实性 HTTPS与HTTP的区别: 1)HTTPS协议需要到ca申请证书,免费证书较少 2)HTTP是超文本传 ...
 - Redis的基操
			
redis:通常BOLEAN操作类型,操作成功返回1,操作失败返回0 通常如果往设置的key插入值,但是这个key不存在,redis则会创建 向redis里的某个key插入多个值时,值和值之间用空格隔 ...
 - stm8 单线串口能收不能发
			
原因是把连接的TX和RX短接了,其实在TX和RX间要串一个电阻,然后让stm8的单线TX接到RX.