python之路(9)反射、包装类、动态模块导入
目录
反射
python提供自省的四个方法:
hasattr(object,name) 判断object中有没有有个name字符串对应对应的方法和属性
class demo:
name = 'chen'
age = '22'
def test_func(self):
print("存在") hasattr(demo, 'test_func') #True
hasattr(demo, 'name') #True
hasattr(demo, 'date') #False
(常用)getattr(object,name,default=None) 根据name字符串寻找object中对应的数据属性或函数属性,相当于object.name
class demo:
name = 'chen'
age = '22'
def test_func(self):
print("存在") getattr(demo, 'test_func') #<function demo.test_func at 0x00000264F0ABA9D8>
getattr(demo, 'name') #chen
getattr(demo, 'date') #报错
setattr(object,name,value) 根据name字符串去设置或修改object中相对应的数据属性或函数属性,相当于object.name=value
class demo:
name = 'chen'
age = '22'
def test_func(self):
print("存在") #设置数据属性
setattr(demo,'date','2018/11/21')
print(getattr(demo, 'date')) #2018/11/21
#设置函数属性
setattr(demo,'test2_func',lambda x:x+2)
print(getattr(demo, 'test2_func')(8)) #10
delattr(object,name) 根据name字符串去删除object中相对应的数据属性或函数属性,相当于del object.name
class demo:
name = 'chen'
age = '22'
def test_func(self):
print("存在") delattr(demo,'name')
反射使用类中用到的三个内置函数
(常用)_getattr_ 当访问的属性找不要的时候执行这个这个函数
class demo:
def __init__(self,name,age):
self.name = name
self.age = age def __getattr__(self, item):
print("不存在%s属性"%item) d1 = demo('chen',22)
#调用不存在的属性
d1.data #不存在data属性
补充:
_getattribute_ 当访问属性时,无论属性存不存在,都会执行,当与_getattr_函数同时存在时,优先执行_getattribute_ ,忽略_getattr_函数。
所以_getattr_是在_getattribute_ 中抛出一个AttributrError时才会执行
class demo:
def __init__(self,name,age):
self.name = name
self.age = age def __getattr__(self, item): #会被忽略
print("这里是getattr") def __getattribute__(self, item):
print("这里是getattribute")
# raise AttributeError('抛出异常') d1 = demo('chen',22)
#调用不存在的属性
d1.data #这里是getattribute class demo:
def __init__(self,name,age):
self.name = name
self.age = age def __getattr__(self, item):
print("这里是getattr") def __getattribute__(self, item):
print("这里是getattribute")
raise AttributeError('抛出异常') #抛出异常,会调用__getattr__方法去执行 d1 = demo('chen',22)
#调用不存在的属性
d1.data #这里是getattribute\n这里是getattr
_setattr_ 当赋值属性值时执行这个函数
class demo:
def __init__(self,name,age):
self.name = name #赋值操作
self.age = age #赋值操作 def __setattr__(self, key, value):
print("key:%s value:%s"%(key,value))
self.__dict__[key]=value d1 = demo('chen',22) #key:name value:chen key:age value:22
_delattr_ 当删除属性事执行这个函数
class demo:
def __init__(self,name,age):
self.name = name #赋值操作
self.age = age #赋值操作 def __delattr__(self, item):
print("删除%s"%item)
self.__dict__.pop(item) d1 = demo('chen',22)
del d1.name #删除name
变量赋值操作的自定制之所有字符串大写
class demo:
def __init__(self,name,age):
self.name = name #赋值操作
self.age = age #赋值操作 def __setattr__(self, key, value):
if type(value) is str:
self.__dict__[key] = value.upper() #制定大写
else:
self.__dict__[key] = value d1 = demo('chen',22)
print(d1.__dict__) #{'name': 'CHEN', 'age': 22}
利用继承二次包装标准类
class List(list):
def append(self, value):
if type(value) is str:
super().append(value)
else:
print('只能添加字符串类型') def show_midlle(self): #求列表中间的value
mid_index=int(len(self)/2)
return self[mid_index] l1=List('chen')
l1.append(12) #只能添加字符串类型
l1.show_midlle() #e
利用授权二次包装标准类
授权也是一种包装,但不是通过继承去实现,利用_getattr_实现
import time
class FileHandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
#已实现的功能,依然用原来的功能
self.file=open(filename,mode,encoding=encoding) # 定制在写入文件时,写入时间的写函数
def write(self,line):
t=time.strftime('%Y-%m-%d %X')
self.file.write('%s %s' %(t,line)) #如果访问的属性不纯在
def __getattr__(self, item): return getattr(self.file,item) f1=FileHandle('a.txt','w+',encoding='utf-8') f1.write('第一条\n')
f1.write('第二条\n')
f1.write('第三条\n')
2018-11-21 19:11:07 第一条
2018-11-21 19:11:07 第二条
2018-11-21 19:11:07 第三条
动态导入模块
# 导入的是m1,不是m1下的t文件
# 这样导入的是路径最顶层的模块
module_t = __import__('m1.t') #
print(module_t) #<module 'm1' (namespace)>
module_t.t.test3() #这里是t模块 #利用模块导入
import importlib
#导入的是m1下的t文件
m = importlib.import_module("m1.t")
print(m) # <module 'm1.t' from 'F:\\PyCharm 2018.2.3\\PycharmProjects\\chen\\day13\\m1\\t.py'>
m.test3() #这里是t模块
python之路(9)反射、包装类、动态模块导入的更多相关文章
- isinstance和issubclass、动态模块导入、异常处理
一.isinstance和issubclass isinstance:判断某个对象是否是某个类的实例,返回True或Flase issubclass:判断某个类是否是某个类的子类. 例如: class ...
- python之路第五篇之模块和加密算法(进阶篇:续)
模块 Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中有一个概念叫做模块(module) 简单地说,模块就是一个保存了Python代码的文件. 模块分类: 1)内置模块 2)自 ...
- Python之路(第二十篇) subprocess模块
一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念 ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- python之路(8)常用模块
目录 os模块 sys模块 json模块 pickle模块 xml模块 re模块 logging模块 configparser模块 hashlib模块 time模块 random模块 subproce ...
- Python之路(第十七篇)logging模块
一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...
- Python之路(第二十一篇) re模块
一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...
- Python之路(第十三篇)time模块、random模块、string模块、验证码练习
一.time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.(从 ...
- python动态模块导入
首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py 官方推荐: import importlib aa = importlib.import_module('lib.aa') c = ...
随机推荐
- PM过程能力成熟度4级
话说3级的PM已经非常厉害了,但仍然处于定性阶段.如何才能不动声色的跟BOSS过招?PM 4级就是让数字变成你的嘴巴,开启项目管理的量化大门.因此,4级PM的工作重心(详见上一篇文章中的表格),也会逐 ...
- Jmeter接口测试实战-数据传递
Jmeter接口测试实战-数据传递 接口与接口之间没有关联的测试是缺乏意义和没有灵魂的,只有数据在不同接口之间传递才能勾画出业务场景重要的链路. 我们用较为通用的http/https协议,接口普遍返回 ...
- Centos7 使用 kubeadm 安装Kubernetes 1.13.3
目录 目录 什么是Kubeadm? 什么是容器存储接口(CSI)? 什么是CoreDNS? 1.环境准备 1.1.网络配置 1.2.更改 hostname 1.3.配置 SSH 免密码登录登录 1.4 ...
- 智能ERP收银统计-优惠统计计算规则
1.报表统计->收银统计->优惠统计规则 第三方平台优惠:(堂食订单:支付宝口碑券优惠)+(外卖订单:商家承担优惠) 自平台优惠:(堂食订单:商家后台优 ...
- powershell-将powershell脚本排到JOB
Program/script下填写“Powershell”,表示这个脚本会在powershell环境下运行 Add arguments(optional)填写脚本绝对路径名称 Start in(Opt ...
- “尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。”
远程连接服务器的数据库调试WCF程序时,可以正常访问数据库,但将程序发布成站点部署在数据库所在的服务器之后,一直报错,通过try/catch捕获得到以下报错信息: System.Exception: ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- Git + Docker + Jenkins自动化部署web到Linux(Centos)
1.把代码托管到Github上 2.安装Docker 3.安装Jenkins 4.在项目中编写Dockerfile.publish.sh (1)Dockerfile内容 # 基于dotnet基础环境构 ...
- 课堂练习6--统计txt文本
统计文本中26个字母的频率: package bao; import java.io.BufferedReader; import java.io.FileReader; import java.io ...
- 使用ES6的模块编写web页面碰到的坑
昨天写最近在做的web应用时,在web页面的js文件中使用了模块功能,这样在html文件中只需要导入一个js就好了