一,反射
反射的四个方法:
getattr(obj,字符串参数):根据字符串(第二个参数)为参数,去对象(第一个参数)中寻找与之同名的成员
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)
反射示例:
示例一 --- 模块
f0 = 9 def f1(): print('F1') def f2(): print('F2') def f3(): print('F3') def f4(): print('F4') def f5(): print('F5')
from types import FunctionType import handler while True: print(""" 系统支持的函数有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("请输入要执行的函数:") # val = "f1" if hasattr(handler,val): #如果输入的函数存在模块中的话 func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。 if isinstance(func_or_val,FunctionType): #找到同名成员,判断是不是函数 func_or_val() else: print(func_or_val) else: print('handler中不存在输入的属性名')
示例二 ---- 面向对象
class Foo(object): country = "中国" def func(self): pass v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。 print(v) obj = Foo() v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。 print(v)
反射补充内容:
x1 = 123 def f1(arg): print(arg,666)
import xx # getattr v1 = getattr(xx,'x1') v2 = getattr(xx,'f1') v2('杨森') # hasattr v3 = hasattr(xx,'x1') v4 = hasattr(xx,'f1') v4 = hasattr(xx,'f1') v5 = hasattr(xx,'xxxxxxx') print(v3,v4,v5) # setattr setattr(xx,'x2',999) v6 = getattr(xx,'x2') print(v6) setattr(xx,'f2',lambda x:x+1) v7 = getattr(xx,'f2') v8 = v7(1) print(v8) # delattr delattr(xx,'x1') v9 = getattr(xx,'x1') print(v9)
二,怎么判断是函数还是方法
方法和函数
称谓:
类,方法
外,函数
到底方法函数?
对象.xxx --> xxx就是方法
类.xxx --> xxx就是函数
xxx --> xxx就是函数
打印查看:
function
method
代码检查:
from types import MethodType,FunctionType def check(arg): """ 检查arg是方法还是函数? :param arg: :return: """ if isinstance(arg,MethodType): print('arg是一个方法') elif isinstance(arg,FunctionType): print('arg是一个函数') else: print('不知道是什么')
浙公网安备 33010602011771号