反射

一、反射

  • 手动输入要运行的功能,反着去模块里找

二、相关函数

1. getattr(对象,属性(字符串形式))

  • 从对象中获取属性
class Person:
    country = "China"

    def eat(self):
        print("-----eat-----")


obj = Person()
print(getattr(Person, "country"))  # China

# 类名.方法名(对象):方法调用的另一种方式
getattr(Person, "eat")(obj)   # -----eat-----
getattr(obj, "eat")           # -----eat-----

2. hasattr(对象,属性(字符串形式))

  • 判断对象中是否有该属性
class Person:
    country = "China"

    def eat(self):
        print("-----eat-----")


obj = Person()
print(hasattr(Person, "country"))  # True
print(hasattr(obj, "run"))         # False

 3. setattr(对象,属性(字符串形式),值)

  • 如果属性存在,则更改属性的值
  • 如果属性不存在,则新增属性,并把值赋给属性
class Person:
    country = "China"

    def eat(self):
        print("-----eat-----")

obj = Person() setattr(Person,
"eat", 3) # 此时内存中函数eat变为eat = 3 obj.eat() # 报错

 4. delattr(对象,属性(字符串形式))

  • 删除对象中的属性
class Person:
    country = "China"

    def eat(self):
        print("-----eat-----")


obj = Person()
delattr(Person, "eat")
obj.eat()    # 'Person' object has no attribute 'eat'

 注:以上四个函数都是对加载到内存中的代码进行操作的,并不会影响源代码

5.总结:

1)对于属性:

  • getattr(类名,属性(字符串形式))               ----->类.属性

  • getattr(对象,属性(字符串形式))               ----->对象.属性

  • setattr(类名,属性(字符串形式),值)       ----->修改类属性的值

  • setattr(对象,属性(字符串形式),值)       ----->给对象添加属性
  • delattr(类名,属性(字符串形式))              ----->删除对象属性
  • delattr(对象,属性(字符串形式))              ----->报错,对象没有该属性

2)对于实例方法:

  • getattr(类名,属性(字符串形式))(对象)  ----->调用实例方法
  • getattr(对象,属性(字符串形式))()    ----->调用实例方法
  • setattr(类名,属性(字符串形式),值)      ----->如果属性名存在,则修改方法,类型根据值的类型,如果不存在,则新增。给类新增函数时,需要考虑函数形参个数,如果无形参,则用对象.函数名调用报错
  • setattr(对象,属性(字符串形式),值)     ----->如果属性名存在,则给对象添加属性,类型根据值的类型,如果不存在,则新增
  • delattr(类名,属性(字符串形式))            ----->删除对象方法
  • delattr(对象,属性(字符串形式))            ----->报错,对象没有该属性

三、应用

场景:如果已知py文件有哪些方法,但想测试各方法作用,摘一摘自己想用的内容

# master.py文件里内容:
def run():
    print("-----run-----")

def eat():
    print("-----eat-----")

def drink():
    print("-----drink-----")

 

代码:

import master
from types import FunctionType

while 1:
    gn = input("请输入你要测试的功能:")
    
    if hasattr(master, gn):  # 如果master里面有你要的功能
        # 获取这个功能,并执行
        attr = getattr(master, gn)
        # 判断是否是函数,只有函数才可以被调用
        if isinstance(attr, FunctionType):
            attr()
        else:
            # 如果不是函数, 就打印
            print(attr)

 

posted @ 2018-11-09 16:48  Ethan_Y  阅读(204)  评论(0编辑  收藏  举报