面向对象的反射&动态导入模块
反射的四个机制 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()