反射 通过字符串操作对象(类,空间)的属性或方法
可以以整个模块(py文件)作为对象,调用模块中的函数
可以使用.(点)来调用的都可以用反射的方式去做
反射是一组:四个方法
hasattr *** 判断类或者对象是否有这个属性或方法有则返回Ture无则返回False
getattr *** 得到类或对象的属性值或函数的地址
setattr * 设置类或对象的属性,或方法
delattr * 删除类或对象的属性或方法
class A:
rock = '洛奇'
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('666')
print(hasattr(A, 'rock')) # 判断A这个类中是否有rock属性
print(hasattr(A, 'func')) # 判断A这个类中是否有func方法
#
# # 可以通过输入或接收字符串来执行相应的方法
content = input('>>>:').strip()
print(hasattr(A, content))
print(getattr(A, content))
# 若输入的是func
if hasattr(A, content):
getattr(A, content)(1)
a = A('bob', 18)
print(hasattr(a, 'name')) # Ture
print(hasattr(a, 'gender')) # False
print(getattr(a, 'age')) # 18
setattr(a, 'gender', 'male')
print(a.__dict__) # {'name': 'bob', 'age': 18, 'gender': 'male'}
setattr(a, 'func2', lambda x: x**2)
print(a.func2(2)) # 4
def func3(x):
print(x)
#
setattr(a, 'func3', func3) # 可给类或对象增加一个方法
a.func3(2) # 2
delattr(a, 'name')
print(a.__dict__) # 删除对象的一个属性
同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量
# 同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量
import sys
obj = sys.modules[__name__]
# print(obj)
# print(obj.__dict__)
# print(globals())
# obj1 = globals()
# print(obj1['__file__'])
def func1():
print('in func1')
def func2():
print('in func2')
def func3():
print('in func3')
l1 = ['func%s' % i for i in range(1, 4)] # ['func1', 'func2', 'func3']
print(l1)
for i in l1:
getattr(obj, i)()
#
# # 通过输入相应序号执行相应函数
content = int(input('>>>:'))
getattr(obj, l1[content-1])()
通过反射调用其他模块中的函数,变量,类
# 在另一个文件中写好以下代码
# 如day22
flag = True
def func(a):
print(a)
return a + 3
class B:
name_list = ['rock', 'America']
def __init__(self, name, gender):
self.name = name
self.gnder = gender
def func(self):
print(4455)
# 新建一个模块
# 首先导入模块
import day22
# 到另一模块中flag的值
print(getattr(day22, 'flag'))
#
# # 执行另一模块中func函数
print(getattr(day22, 'func')(10))
# 调用另一模块中B类中的name_list
print(getattr(day22.B, 'name_list'))
# 调用另一模块中B类中的func方法
getattr(day22.B, 'func')(1)
# 用另一模块中的B类实例化对象b
b = day22.B('rock', '男')
# 用b对象调用类中的方法
print(getattr(b, 'name_list'))
# 用b对象调用自己的属性
print(getattr(b, 'name'))
getattr(b, 'func')()