反射

             反射      **********             ide

       gerattr(a,b)    根据字符串为参数 (第二个参数) , 去 对象(第一个参数) 中寻找与之同名的成员.函数

  例一 : 面对函数的反射spa

    如今有2个py文件(在同一个文件下面的平等文件),如今想从run.py 中调用 handler.py 中的东西.3d

 

#handler.py

f0 = 9

def f1():
    print('F1')

def f2():
    print('F2')

def f3():
    print('F3')

def f4():
    print('F4')

def f5():
    print('F5')

 

#run.py
#咱们能够使用if ...elif....的方法执行
import handler

while True:
    print("""
    系统支持的函数有:
    1 f0
    2 f1
    3 f2
    4 f3
    5 f4
    6 f5
    """)
    num = input("请输入您要执行的函数:")
    if num == "f0":
        print(9)
    elif num == 'f1':
        handler.f1()
    elif num == 'f2':
        handler.f2()
    elif num == 'f3':
        handler.f3()
    elif num == 'f4':
        handler.f4()
    elif num == 'f5':
        handler.f5()

#用 if...elif...方法,若是在handler.py文件的函数特别多,就会使代码繁杂.
if....eliff...方法
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中不存在输入的属性名')
方法 二

 

    全部,咱们 比较 方法一 和方法二,发现方法二比方法一简介并且定位准code

  例二 : 面对 面向对象的反射对象

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)

结果:
<function Foo.func at 0x00000000025FCEA0>
<bound method Foo.func of <__main__.Foo object at 0x00000000025FB2E8>>

 

#反射----类
class Foo(object):

    def __init__(self,a1):
        self.a1 = a1
        self.a2 = None

obj = Foo(1)


v1 = getattr(obj,'a1')
print(v1)

setattr(obj,'a2',2)

 

x1 = 123


def f1(arg):
    print(arg,666)
xx.py

 

import xx

# getattr                          #查找
v1 = getattr(xx,'x1')
v2 = getattr(xx,'f1')
v2('杨森')                      # 杨森 666                   

# hasattr                        #判断是否由成员
v3 = hasattr(xx,'x1')
v4 = hasattr(xx,'f1')
v4 = hasattr(xx,'f1')
v5 = hasattr(xx,'xxxxxxx')
print(v3,v4,v5)                   #True True False

# setattr                         #在内存中添加 x2= 999
setattr(xx,'x2',999)
v6 = getattr(xx,'x2')
print(v6)                          # 999

setattr(xx,'f2',lambda x:x+1)   #添加一个函数
v7 = getattr(xx,'f2')
v8 = v7(1)
print(v8)                        # 2 由于 添加函数 x+1  参数为1

# delattr                        #删除 x1
delattr(xx,'x1')
v9 = getattr(xx,'x1')
print(v9)

结果:
调用 xx.py内的内容

     

      总结:blog

           getattr(a,b)  : 根据字符串为参数(第二个参数b),去对象中(第一个参数a)寻找与之同名的成员内存

           hasattr(a,b) : 根据字符串形式(第二个参数b) ,去判断对象(第一个参数a)中是否有该成员v8

           setattr (a,b,c): 参数分别是新建对象所属类的类名,新建对象的对象名,对象的值 (在内存中体现,在文件中是看不到的)字符串

           delattr(a,b) : 根据字符串为参数 (b),动态的删除对象中(第一个a)一个成员(在内存中体现)