一、反射
一、什么是反射
把字符串映射到实例的变量或者实例的方法,然后可以去进行调用、修改操作.Python的反射机制(Reflection)指的是程序能够检查和修改其自身结构或行为的能力。在Python中,由于语言的动态特性,反射通常通过内建函数
(如getattr(), setattr(), hasattr(), delattr(), dir(), callable(), isinstance(), issubclass()等)和一些其他特性(如__getattr__()和__setattr__()等魔术方法)来实现。
二、反射的四大操作
getattr(object, name[, default]): # 获取对象object的名为name的属性。如果属性不存在,则返回default(如果提供了)。 setattr(object, name, value): # 设置对象object的名为name的属性的值为value。 hasattr(object, name): # 检查对象object是否有一个名为name的属性。 delattr(object, name): # 删除对象object的名为name的属性。 dir(object): # 返回对象的属性列表,包含对象的所有方法和变量(包括从基类继承的)。 callable(object): # 检查对象object是否可以被调用(即,它是否实现了__call__()方法)。 isinstance(object, classinfo): # 检查对象object是否是一个类(或元组中的类之一)的实例。 issubclass(class, classinfo): # 检查类class是否是类classinfo的子类(或元组中的类之一)class Reflection: def __init__(self, name, age): """ init """ self.name = name self.age = age def welcome(self): print("欢迎你加入组织!") def learning(self): print("正在学习,拉开差距") def func_learning(): print("函数(类外)") if __name__ == '__main__': reflect = Reflection("王勇", 29) # 获取实例属性 # print(reflect.name, reflect.age) # 1. getattr 获取对象属性/方法 name = getattr(reflect, "name") # #把字符串映射到实例的变量 print(name, type(name)) # 王勇 <class 'str'> age = getattr(reflect, "age") print(age, type(age)) # 29 <class 'int'> # 获取实例方法 method = getattr(reflect, "welcome") # #映射到实例的方法 # <bound method Reflection.welcome of <__main__.Reflection object at 0x00E1DD10>> <class 'method'> print(method, type(method)) # 执行方法 method() # 2、hasattr判断对象是否有对应的属性或者方法 # if hasattr(reflect, "name"): if hasattr(reflect, "learning"): print("正在学习") else: print("熬夜学习中。。。") # 3、setattr 设置(修改)对象的内容(属性/方法) setattr(reflect, "name", "薇薇") # 修改对象的属性 name = getattr(reflect, "name") print(f"被修改的对象属性:{name}") # 被修改的对象属性:薇薇 # 类的外部的函数映射到类里面的方法,增加类中的方法 setattr(reflect, "func_learning", func_learning) getattr(reflect, "func_learning")() # # 函数(类外) reflect.func_learning() # 函数(类外) # 4、delattr删除指定属性 delattr(reflect, "age") # print(reflect.age) # AttributeError: 'Reflection' object has no attribute 'age'
class Practice: def login(self): print("登录") def register(self): print("注册") def logout(self): print("注销") def run(self): choice = { "1": "login", "2": "register", "3": "logout", } num = input(choice) action = getattr(self, choice[num]) action() if __name__ == '__main__': Practice().run()