反射

 

   反射(1)

# 反射

# python中一切皆对象,类也是一个对象

# 平时我们有可能遇见这么一情况,一个字符串'name',我们经常想通过这个字符串'name'直接就拿到变量name的值

# 三个内置函数,反射相关,根据字符串格式的属性或方法,得到实际存在的属性值和方法
    # hasattr
        # 判断一个对象的某个属性有没有,有返回True
    # getattr
        # 参数为对象名与字符串数据类型的变量名。 可以得到该对象命名空间中该字符串值对应的变量值
        # 获取一个对象的属性或方法
    # delattr


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

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

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

if hasattr(Teacher, 'dic'): # 判断Teacher中有没有dic属性
    ret = getattr(Teacher, 'dic')   # 得到Teacher中的dic属性值
    print(ret)  # {'查看讲师信息': '', '查看学生信息': ''}

ret2 = getattr(Teacher, 'func') # 得到Teacher中的func方法,可以通过ret2()调用
ret2()  # hhaa

t = Teacher()
if hasattr(t, 'show_student'):
    ret3 = getattr(t, 'show_student')
    ret3()  # show_student

   反射(2)

# 补充的两个内置函数isinstance和issubclass

#isinstance # 判断类与对象的关系
    #isinstance(obj, cls)    # 检查obj是否是类cls的对象


# issubclass    # 判读类与类的关系
    # issubclass(sub, super)检查sub类是否是super类的派生类(子类)







# 反射是一个非常非常重要的知识点
# 反射:是用字符串类型的名字去得到变量
    # hasattr
    # getattr
    # setattr   # 设置修改变量
        # setattr(a, 'name', 'nezha')   给a设置了一个属性name,值是nezha
    # delattr   # 删除一个变量
    # 可以反射类的属性和方法
    # 可以反射模块的属性和方法
    # 可以反射对象的属性和方法
    # 可以反射自己的模块的方法和属性
        # getattr(sys.modules[__name__], '变量名')
    # 可反射内置模块的方法和属性

# 反射对象中的属性和方法
class A:
    def func(self):
        print('in func')
    @classmethod
    def func1(self):
        print('in func1')

a = A()

# 反射的方式增加属性,一般不用
setattr(a, 'name', 'alex')  # 给a设置了一个属性name,值是alex
# 反射对象的属性
if hasattr(a, 'name'):  # 判断a对象是否有name属性
    print(getattr(a, 'name'))   # 'alex'

# 使用反射做删除,很危险,用的很少
delattr(a, 'name')  # 删除a中name属性

# 反射对象的方法
if hasattr(a, 'func'):
    ret = getattr(a, 'func')
    ret()   # in func

# 反射类的方法
ret = getattr(A, 'func1')   # 得到类的方法,func1
ret()   # in func1

# 反射模块的属性


# 反射模块中的方法

 

posted @ 2018-10-03 12:10  _小溢  阅读(150)  评论(0)    收藏  举报