反射

class Teacher:
    dic = {
        '查看学生信息': '',
        '查看讲师信息': ''
    }

    @staticmethod
    def show_student():
        print('show_student')

    @staticmethod
    def show_teacher():
        print('show_teacher')

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


if hasattr(Teacher, 'dic'):
    ret = getattr(Teacher, 'dic')
    print(ret)

ret2 = getattr(Teacher, 'func')
ret2()

 

 

1、反射对象里的属性

class A:
    name = 'wang'


a = A()
a.age = 11
# 通过变量名的字符串形式来获取它的值
# 以前只能通过 . 的方式来获取它的值 ret
= getattr(a, 'age') print(ret)

 

反射的最常用场景

class A:
    name = 'wang'


a = A()
# 我们指定变量 attr
= input('你想获取哪个变量的值: ')
# 根据变量获取它的值 ret
= getattr(a, attr) print(ret)

 

2、反射对象里的方法

class A:
    def func(self):
        print(self.__dict__)


a = A()
ret = getattr(a, 'func')  # 方法的字符串名字
print(ret)  # ret是func的内存地址
ret()       # 调用该方法

<bound method A.func of <__main__.A object at 0x033C0FB0>>

{}

 

3、反射类的属性

class A:
    name = 'wang'


a = A()
# 通过变量名的字符串形式来获取它的值
# 以前只能通过 . 的方式来获取它的值
ret = getattr(a, 'name')
print(ret)

 

 

4、反射类的方法,包括静态方法和类方法

class A:
    @classmethod
    def func1(cls):
        print('A classmethod')

    @staticmethod
    def func2():
        print('A staticmethod')


if hasattr(A, 'func1'):
    ret = getattr(A, 'func1')
    ret()

if hasattr(A, 'func2'):
    ret = getattr(A, 'func2')
    ret()

 

5、反射模块的属性和方法(内置模块和自定义模块和第三方模块)

这是模块test1的代码:

day = 11


def test():
    print('这是test1模块中的方法test')

在其他地方引用该模块:

import test1


if hasattr(test1, 'day'):
    ret = getattr(test1, 'day')
    print(ret)

if hasattr(test1, 'test'):
    ret = getattr(test1, 'test')
    ret()

 

6、反射自己模块中的属性和方法

import sys


year = 2019


def self_test():
    print('self test')


ret1 = getattr(sys.modules['__main__'], 'year')
print(ret1)

ret2 = getattr(sys.modules['__main__'], 'self_test')
ret2()

print(sys.modules)  # 打印加载的所有模块

# __main__代表当前模块,也就是我们所在的文件

 

以下是更好的写法:

import sys


year = 2019


def self_test():
    print('self test')


ret1 = getattr(sys.modules[__name__], 'year')
print(ret1)

ret2 = getattr(sys.modules[__name__], 'self_test')
ret2()

print(sys.modules)

 

反射能反射到一切对象,只要它存在,就能反射到。因为反射的本质是找对象的内存地址。

7、设置属性和删除属性

posted @ 2019-11-06 10:32  道霖  阅读(148)  评论(0)    收藏  举报