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>

浙公网安备 33010602011771号