二十、 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'))

 

posted @ 2016-06-18 22:24  咖啡茶  阅读(84)  评论(0)    收藏  举报