二十、 Python 面向基础(一) 对象访问和反射机制
一、 python 反射
1:通过字符串的形式导入模块
2:通过字符串的形式去模块中寻找指定函数或者变量并执行
3:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
二、python中的反射内置函数
- hassttr 对象内部是否含有某成员
- getattr 对象内部获得某成员
- setattr 对象内部设置某成员 (只在内存执行)
- delattr 删除某成员 (只在内存执行)
1: __import__ 导入模块
导入结果是module
1 #使用__import__导入的时候,如果是多目录的,需要设置fromlist 2 inp = __import__('lib.pr1',fromlist = 'True') 3 print(type(inp)) 4 5 6 C:\Python35\python.exe D:/python/day8/pr.py 7 <class 'module'>
1 #使用__import__导入的时候,如果是多目录的,需要设置fromlist 2 inp = input('请输入模块') 3 inp_func = input('请输入要执行的函数:') 4 #__import__用于以字符串的形式导入模块 5 dd = __import__(inp,fromlist = True) 6 #getattr_用字符串的形式寻找模块 7 target_func = getattr(dd,inp_func) 8 #在获取到的函数后加() 执行函数 9 target_func()
2:反射机制 类中字符串操作成员
1 class Foo(object): 2 3 def __init__(self): 4 self.name = 'yy' 5 6 def func1(self): 7 return 'func' 8 9 obj = Foo() 10 11 #检查是否有成员 12 print(hasattr(obj,'name')) 13 print(hasattr(obj,'func1')) 14 15 #得到成员 16 print(getattr(obj,'name')) 17 print(getattr(obj,'func1')) 18 19 #设置成员 20 setattr(obj,'age',18) 21 setattr(obj,'newfunc',lambda num:num+1) 22 23 print(hasattr(obj,'age')) 24 print(hasattr(obj,'newfunc')) 25 26 #删除成员 27 delattr(obj,'name') 28 delattr(obj,'func1')
3:访问成员
obj 是对象,其中name 和func 都是变量名称
obj.xxxx 表示去obj 中寻找变量名xxx, 并获取对应内存地址中的内容
通过self 指针访问
4:不同访问访问obj中name变量指向内存的值value
1 class Foo(object): 2 3 def __init__(self): 4 self.name = 'yy' 5 6 def func(self): 7 return 'func' 8 9 10 obj = Foo() 11 12 #方法一: 13 print(obj.name) 14 15 #方法二 16 print(obj.__dict__['name']) 17 18 #方法三 19 print(getattr(obj,'name'))
5:一切事物都是对象
当前模块
1 import sys 2 def s1(): 3 print('s1') 4 def s2(): 5 print('s2') 6 7 this_module = sys.modules[__name__] 8 9 hasattr(this_module,'s1') 10 getattr(this_module,'s2')
类也是对象
1 class Foo(object): 2 3 staticField = 'test' 4 5 def __init__(self): 6 self.name = 'yy' 7 8 def fun(self): 9 return 'fun' 10 11 @staticmethod 12 def bar(): 13 return 'bar' 14 15 16 print(getattr(Foo,'staticField')) 17 print(getattr(Foo,'fun')) 18 print(getattr(Foo,'bar'))

浙公网安备 33010602011771号