一,反射

反射的四个方法:

  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')
handler模块

 

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)
View Code

 

反射补充内容:

x1 = 123


def f1(arg):
    print(arg,666)
xx模块中的内容
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('不知道是什么')