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 ...
随机推荐
- JS部分
前端三剑客(HTML,CSS,JavaScript) Html:负责一个页面的结构 Css:负责一个页面的样式 JavaScript:负责与用户进行交互 JS概念 JS是JavaScript的简称,是 ...
- java读取properties文件时候要注意的地方
java读取properties文件时,一定要注意properties里面后面出现的空格! 比如:filepath = /home/cps/ 我找了半天,系统一直提示,没有这个路径,可是确实是存在的, ...
- 201621123008 《Java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...
- Getting svn to ignore files and directories
August 27, 2013Software Developmentresources, subversion, svn, tutorial, version control Who knew it ...
- Spring Environment(二)源码分析
Spring Environment(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Envi ...
- Servlet 2.x 规范
Servlet 2.x 规范 sun 公司制订的一种基于 Java 技术的 WEB 服务器功能的组件规范.1997 年六月,Servlet 1.0 版本发行,最新版本 Servlet 4.0 处于研发 ...
- Docker 介绍和使用
Docker 技术可以实现容器装载软件和依赖库,类似于封闭的Linux系统,默认相当于有root权限,可以快速移植和部署到其他机器上. Docker 容器技术可以理解为:仓库(储物间),镜像(类似于面 ...
- 【Redis】Redis-benchmark测试Redis性能
Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能. 使用说明如下: Usage: redis-benchmark [-h <host>] ...
- rails 部署 can't find gem bundler (>= 0.a) with executable bundle
多方寻找终得果,先感谢原作者,原作者博文 原因是本地项目bundler 和 服务器 bundler 版本不一致导致,项目是在本地建立,故Gemfile.lock最后一行BUNDLED WITH中是1. ...
- sqlserver中如何将mdf文件还原到数据库