71-python-反射

# 反射:
# 没有安全问题
# 用字符串类型的名字 去操作 变量

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 已经删除

  

posted @ 2018-11-06 20:03  _Q  阅读(83)  评论(0)    收藏  举报