面向对象的反射&动态导入模块

反射的四个机制 hasattr getattr setattr delattr 具体实现代码如下

 1 class People:
 2     def __init__(self,name,age,id):
 3         self.name=name
 4         self.age=age
 5         self.id=id
 6 
 7     def play(self):
 8         print('%s现在开始玩游戏了,告诉我你的ID%s'%(self.name,self.id))
 9 
10     def sleep(self):
11         print('%s ,不早了,赶快休息哦!'%self.name)
12 
13 p1=People('小婉',18,429006)
14 p1.play()
15 p1.sleep()
16 print(hasattr(p1,'name')) #检查对象里是否含有name这个属性 有则为TRUE
17 print(getattr(p1,'age233','找不到这样的元素')) #检查对象里是否含有name这个属性 有则为获取,无则返回默认设置的字符串
18 sp1=setattr(p1,'sex','woman') #向对象里添加指定属性(键值对形式)
19 print(p1.__dict__)
20 delattr(p1,'sex')  #删除指定对象属性 以key为主
21 
22 print(p1.__dict__)

 

1 import sys
2 name='lisa'
3 def say():
4     print('hello python')
5 
6 print(sys.modules['__main__'].name)
7 print(getattr(sys.modules['__main__'],'name'))     #属性
8 getattr(sys.modules[__name__],'say')()             #方法

 

反射自己模块中的属性变量sys.modules[''__main__"]

反射自己模块中的方法函数sys.modules[__name__]

*************************************************************************************************

动态导入模块,解析字符串 __import__

 1 # from src import Student
 2 from src.Student import _Room #私有类也可以直接导入类名后调用
 3 # im=__import__('src.Student')  #动态导入模块 解析出字符串src
 4 # print(im)
 5 # p=im.Student.People('小芬',21,520) #所以对应为src\Student\People类
 6 # p.play()
 7 
 8 # r1=im.Student._Room('小马','20',11,13,5)
 9 r1=_Room('小马','20',11,13,5)
10 print(r1.name)

 类的内置函数

__getattr__
__delattr__
__setattr__
 1 class Fun:
 2     wt='func'
 3     def __init__(self,name,age):
 4         self.name=name
 5         self.age=age
 6 
 7     # def __getattr__(self, item): #找不到对象属性时会触发
 8     #     print('----->执行getattr中')
 9 
10     # def __delattr__(self, item):  #删除属性或类时会触发
11     #     print('------>执行delattr中')
12 
13     def __setattr__(self, key, value): #设置属性或类时会触发
14         self.__dict__[key] = value
15         print('------>执行setattr中')
16 
17 f1=Fun('小马',18)
18 print(f1.name)
19 f1.sex='woman'
20 print(f1.__dict__)
21 # del f1.name
22 # del f1.wt

 数据的包装(授权) 把句柄赋给一个字段属性(组合) 通过重写类方法来自定义函数,以达到方法的目的

 1 class Open:
 2     '文件打开类'
 3     def __init__(self,filename,model,enc):
 4         self.filename=open(filename,model,encoding=enc)
 5         self.model=model
 6         self.encoding=enc
 7 
 8     def read(self):
 9        return getattr(self.filename,'read')
10 
11     def write(self,say):
12         t=time.strftime('%Y:%m:%d:%X')
13         self.filename.write(t +say+'\n')
14 
15     # def __getattr__(self, item):
16     #     return getattr(self.filename,item,'找不到这样的属性')
17 
18 p1=Open('abc.txt','a+','utf-8')
19 p1.write('CPU空间不足')
20 p1.write('硬盘空间不足')
21 p1.write('内存空间不足')
22 p1.write('ftp空间不足')
23 
24 # print(p1.read123)
25 # print(p1.read()())
26 # p1.write()

 

posted @ 2018-06-30 14:13  青红*皂了个白  阅读(171)  评论(0编辑  收藏  举报