Python 反射
1. 反射
通过字符串映射或修改程序运行时的状态、属性、方法,有以下4个方法。
- hasattr(obj,str): 判断一个对象obj里是否有对应的str字符串的方法
- getattr(obj,str,defaullt=None):根据字符串去获取obj对象里,对应方法的内存地址
- setattr(obj,str,func):给模块添加属性(函数或变量)
- delattr(obj,str):删除模块中某个变量或函数
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
# 返回 choice对象
attr = getattr(d,choice)
attr("骨头") # 运行方法
添加方法:
# bulk方法
def bulk(self):
print("%s is yelling...."%self.name)
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
attr = getattr(d,choice)
attr("骨头")
else:
setattr(d,choice,bulk) # 添加bulk方法
func = getattr(d,choice) # 获取方法
func(d)
删除方法:
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating %s" %(self.name,food))
d = Dog("泰迪")
# 输入方法
choice = input(">>>:").strip()
# 判断 choice输入的方法是否在 d对象里
if hasattr(d,choice):
delattr(d,choice) # 删除方法
# 打印name
print(d.name)
反射自己模块中的变量和函数:
import sys
cc = sys.modules['__main__'] # 查看自己的模块
def af():
print("af_1111")
def bf():
print("bf_2222")
name = "jack"
while True:
aa = input(">>>:")
if hasattr(cc,aa):
func = getattr(cc,aa)
# print(func) # 反射自己模块中的变量
# func() # 反射自己模块中的函数