13_反射

反射

用字符串数据类型的名字,来操作这个名字对应的函数/实例变量/绑定方法/各种方法...

用途

​ 有些时候明知道一个变量的字符串数据类型的名字,不能直接调用它,可以使用反射

可以反射的范围

  • 反射对象的实例变量/绑定方法
  • 反射类中的静态变量/绑定方法/其他方法
  • 模块中的所有变量
    • 被导入的模块 (叫模块)
    • 当前执行的py文件 (叫脚本)

例如:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def hello(self):
        print('Hello,world')

person = Person('Jack', 30)

ret = getattr(person, 'name')
print(ret)  # Jack
ret = getattr(person, 'hello')
print(ret)  # <bound method Person.hello of <__main__.Person object at 0x000001ADE461F1C8>>
ret()  # Hello,world

getattr 方法

1、在模块中可以调用(通过 . 调用 )

  • getattr(对象名,'属性名') => 对象名.属性名

2、在脚本中调用(并不能通过 . 调用自己)

  • 通过系统sys.modules[’main’]方法获取自身的前缀。使用自己可以通过 . 调用自己的变量等...

hasattr 方法

  • hasattr(对象名,'属性名')判断对象名是否能反射该属性名

第一种:导入模块中调用

在文件a.py中定义了很多对象

class Person: pass
list_1 = [1, 2, 3, 4, 5]
str_1 = 'Hello,world'
dict_1 = {'k': 'v'}
person = Person()

在脚本中调用a模块,通过反射取出值

import a

print(getattr(a, 'list_1'))  # [1, 2, 3, 4, 5]
print(getattr(a, 'dict_1'))  # {'k': 'v'}
print(getattr(a, 'str_1'))  # Hello,world
print(getattr(a, 'person'))  # <a.Person object at 0x000001D84CA8A3C8>

第二种:在脚本中调用(通过sys.modules)

class Person: pass
list_1 = [1, 2, 3, 4, 5]
str_1 = 'Hello,world'
dict_1 = {'k': 'v'}
person = Person()

import sys

print(getattr(sys.modules['__main__'], 'list_1'))  # [1, 2, 3, 4, 5]
print(getattr(sys.modules['__main__'], 'str_1'))  # Hello,world
print(getattr(sys.modules['__main__'], 'dict_1'))  # {'k': 'v'}
print(getattr(sys.modules['__main__'], 'person'))  # <__main__.Person object at 0x000002297C2EF348>
posted @ 2020-07-28 14:01  小金a  阅读(78)  评论(0)    收藏  举报