反射

反射(*****)

  重点:v = getattr(obj , “func”)  # 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员。

应用一、首先定义一个handler模块,handler.py文件内容如下:

 

 

模块:

def chi():
    print("大牛一顿吃100碗饭")

def he():
    print("大牛一顿喝一桶")

def la():
    print("大牛很能拉")

def shui():
    print("大牛一次睡一年")

name = "大牛"
master.py

test.py

引入 import master

盖特 getattr()    从xxx对象或者模块中找xxxxx(字符串) 功能, 变量

孩子  hasattr()   判断第二个是否在第一个里面

while 1:
    print("""大牛写了很多的功能:
    chi
    he
    la
    shui
""")
    val = input("请输入你要测试的功能") # he

    if hasattr(master, val):
        attr = getattr(master, val) # 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量
        if callable(attr): # 判断这个鬼东西是否可以被调用
            attr()
        else:
            print(attr)
    else:
        print("没有这个功能")

  

# 把chi函数换成lambda
# print(master.chi)
# setattr(master, "chi", lambda x: x + 1)
# print(master.chi)

delattr(master, "la") # 删除xxx
master.la()

  

 

 

 

盖特 getattr()    从xxx对象或者模块中找xxxxx(字符串) 功能, 变量

孩子  hasattr()   判断第二个是否在第一个里面

面向对象的反射:

class Person:
    def __init__(self, name):
        self.name = name
        self.age = None

    def chi(self):
        print("人喜欢吃东西%s" % self.name)

p = Person("刘伟")
val = input("请输入你想让刘伟执行的动作:")
if hasattr(p, val):
    getattr(p, "name")
    func = getattr(p, val)
    func()

  setattr

setattr(p, "name", "大阳哥") # 动态的给对象设置属性和值
setattr(p, "age", 18) # 很少用. 慎用

  delattr   删除

delattr(p, "age")

  

反射就是,先定好我要执行什么功能,然后去你里面找

 

总结:

  getattr   # 根据字符串的形式,去对象中找成员;

  hasattr   # 根据字符串的形式,去判断对象中是否有成员;

  setattr   # 根据字符串的形式,动态的设置一个成员(内存);

  delattr   # 根据字符串的形式,动态的删除一个成员(内存);

posted @ 2018-10-07 17:12  咖啡·  阅读(196)  评论(0编辑  收藏  举报