目录


反射

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)反射、包装类、动态模块导入的更多相关文章

  1. isinstance和issubclass、动态模块导入、异常处理

    一.isinstance和issubclass isinstance:判断某个对象是否是某个类的实例,返回True或Flase issubclass:判断某个类是否是某个类的子类. 例如: class ...

  2. python之路第五篇之模块和加密算法(进阶篇:续)

    模块 Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中有一个概念叫做模块(module) 简单地说,模块就是一个保存了Python代码的文件. 模块分类: 1)内置模块 2)自 ...

  3. Python之路(第二十篇) subprocess模块

    一.subprocess模块 subprocess英文意思:子进程 那什么是进程呢? (一)关于进程的相关理论基础知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念 ...

  4. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  5. python之路(8)常用模块

    目录 os模块 sys模块 json模块 pickle模块 xml模块 re模块 logging模块 configparser模块 hashlib模块 time模块 random模块 subproce ...

  6. Python之路(第十七篇)logging模块

    一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...

  7. Python之路(第二十一篇) re模块

    一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...

  8. Python之路(第十三篇)time模块、random模块、string模块、验证码练习

    一.time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.(从 ...

  9. python动态模块导入

    首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py 官方推荐: import importlib aa = importlib.import_module('lib.aa') c = ...

随机推荐

  1. 纯Java实现微信朋友圈分享图

    纯Java实现微信朋友圈分享图 1.实现分享图的效果 2.开发环境 2.1 JDK * oracle's jdk 1.8以上 2.2 字体 * 若选择了微软雅黑字体又是代码部署到Linux,则需要安装 ...

  2. What is “Neural Network”

    Modern neuroscientists often discuss the brain as a type of computer. Neural networks aim to do the ...

  3. 1 minute教会你shell

    Shell模板 #!/bin/bash ####################################################### # $Name: shell_template. ...

  4. SQLServer创建用户自定义数据库用户

    创建用户自定义数据库用户注意事项 如果已忽略 FOR LOGIN,则新的数据库用户将被映射到同名的SQL Server登录名. 默认架构将是服务器为此数据库用户解析对象名时将搜索的第一个架构. 除非另 ...

  5. Jenkins 使用Tfs 插件出现 MappingConflictException 错误问题解决

    FATAL: com.microsoft.tfs.core.clients.versioncontrol.exceptions.MappingConflictException: The path C ...

  6. 数论 C - Aladdin and the Flying Carpet

    It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summons a ...

  7. IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.

    IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.To make ...

  8. Data Protection - how to manage expired key?(转载)

    问 According to ASP.NET Key Management: Deleting a key is truly destructive behavior, and consequentl ...

  9. 8年,从2D到3D,我的学习之路

    Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...

  10. Unity TimeLine

    最近一直再看这方面的内容,看的比较多知识点比较分散,所以目的就是把这些知识点内容梳理一边,并作记录. PlayableDirector与TrackAsset,TrackAsset与PlayableAs ...