Python反射

反射:用字符串类型的名字去操作变量,没有安全问题。本质是反射对象中的属性和方法。

反射对对应的方法有:getattr, setattr, delattr

getattr:一般与hasattr联合使用

class A:
    def func(self):
        print('in func')

a = A()
a.name = 'alex'
a.age = 63
# 反射对象的属性
ret = getattr(a,'name')  # 通过变量名的字符串形式取到的值
print(ret)
print(a.__dict__)  ###打印属性与方法
print(a.__dir__())  
通过反射获取对象属性
class A:
    a_list =[1, 3, 5, 7, 9]
    @classmethod
    def func(cls):
        print(cls.a_list)
    @staticmethod
    def func2():
        print(A.a_list, "太好了")

print(getattr(A, 'a_list'))
print(getattr(A, 'func')())
getattr(A, 'func2')()


【注】反射类的方法只支持 :classmethod staticmethod,不支持类函数
反射类的方法 :classmethod staticmethod
# import mymodule
# 反射模块的属性
# print(my.day)
 # print(getattr(mymodule,'day'))

# 反射模块的方法
# getattr(mymodule,'wahaha')()

#################
def func():
    print('func111111')
year = 2018

# 反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))

# 反射自己模块中的函数
getattr(sys.modules['__main__'],'func')()
变量名 = input('>>>')
print(getattr(sys.modules[__name__],变量名))


# 内置模块
# time
# asctime
# import time
# print(getattr(time,'time')())
# print(getattr(time,'asctime')())
反射模块
print(time.strftime('%Y-%m-%d %H:%M:S'))
print(getattr(time, 'strftime')('%Y-%m-%d %H:%M:S'))
反射带有参数的函数

setattr:设置修改变量

class A:
    pass
a = A()
setattr(a,'name','nezha')
setattr(A,'name','alex')
print(A.name)
print(a.name)
View Code

delattr:删除一个变量

class A:
    pass
a = A()
setattr(a,'name','nezha')
setattr(A,'name','alex')
print(A.name)
print(a.name)

delattr(a,'name')
print(a.name)
delattr(A,'name')
print(a.name)
删除变量

 

反射demo

class Teacher:
    dic = {'查看学生信息':'show_student','查看讲师信息':'show_teacher'}
    def show_student(self):
        print('show_student')

    def show_teacher(self):
        print('show_teacher')

    @classmethod
    def func(cls):
        print('hahaha')

alex = Teacher()
for k in Teacher.dic:
    print(k)
key = input('输入需求 :')
# print(Teacher.dic[key])
if hasattr(alex,Teacher.dic[key]):
    func = getattr(alex,Teacher.dic[key])
    func()


# hasattr getattr delattr
if hasattr(Teacher,'dic'):
    ret = getattr(Teacher,'dic')   # Teacher.dic   # 类也是对象
    print(ret)
反射demo
【注】# 通过反射,对象名:获取对象属性和普通方法;类名:获取静态属性、类方法和静态方法。
posted @ 2023-04-22 07:47  钟爱酷夏  阅读(20)  评论(0)    收藏  举报