# 反射:
# 没有安全问题
# 用字符串类型的名字 去操作 变量
class A:
size = 90
@classmethod
def f(cls):
print('f')
a = A()
a.name = 'alex'
a.age = 10
# 1. getattr :
# 属性
ret = getattr(a,'name')
# (点左边的,点右边的)
print(ret) # 打印结果:alex
# 方法
ret1 = getattr(a,'f')
ret1() # 打印结果:f
# 直接调用返回值
# 反射类的属性:
# print(A.size)
print(getattr(A,'size')) # 打印结果:90
# 反射类的方法:
# A.f()
if hasattr(A,'f'): # 判断是否有
ret2 = getattr(A,'f')
ret2() # 打印结果:f
# 还可以:getattr(A,'f')() # 打印结果:f
# 反射模块属性:
import my
#print(my.now) # 打印结果:000
ret3 = getattr(my,'now')
print(ret3) # 打印结果:000
# 反射模块方法:
# my.fn() # 打印结果:fn
ret4 = getattr(my,'fn')
print(ret4) # 打印结果:ret4()
# getattr(my,'fn')() # 打印结果:ret4()
import sys
# 反射自己模块中变量
time = '9:40'
print(getattr(sys.modules['__main__'],'time'))
# 打印结果:9:40
# 反射自己模块中的函数
def this():
print('this.fn')
getattr(sys.modules['__main__'],'this')()
# 打印结果:this.fn
# name = input('>>')
# print(getattr(sys.modules[__name__],name))
# __name__ 当这个模块被其他模块引用时,__name__ 返回的时当前模块的名字
# 2. setattr : 设置,修改变量
class Z:
pass
z = Z()
setattr(z,'name','q')
setattr(Z,'name','NEW_q')
print(z.name) # 打印结果:q
print(Z.name) # 打印结果:NEW_q
# 3. delattr : 删除一个变量
delattr(z,'name')
delattr(Z,'name')
print(z.name)
print(Z.name) # 报错,类中 Z 的 name 已经删除