# 28. 反射
# 反射
反射:用字符串数据类型的变量名来访问这个变量的值
在反射的眼里,只是要,名称 . 功能,的都能用反射来使用
反射使用的方法:
getattr(名称(只要是包含内存地址能够调用的就行,类名,变量名,实例化变量名等),字符串(变量名)) ##查询
hasattr(名称(只要是包含内存地址能够调用的就行,类名,变量名,实例化变量名等),字符串(变量名)) ##判断是否存在
setattr(名称(只要是包含内存地址能够调用的就行,类名,变量名,实例化变量名等),字符串(变量名),新的内容) ##修改
delattr ##删除
# 通过反射使用类
获取字符串通过反射来使用类中的,属性,静态属性(静态字段),类方法,静态方法
class a:
name = "我是一个静态属性"
def __init__(self):
self.user = "我是一个属性"
@property
def so(self):
return "我是一个方法伪装的属性"
@classmethod
def wo(cls):
print("我是一个类方法")
@staticmethod
def ro():
print("我是一个静态方法")
## 获取静态属性
print(getattr(a,"name"))
## 获取属性
a1 = a()
print(getattr(a1,"user"))
## 获取伪装方法后的属性
a2 = a()
print(getattr(a2,"so"))
## 获取类方法
getattr(a,"wo")()
## 获取静态方法
getattr(a,"ro")()
执行结果:
我是一个静态属性
我是一个属性
我是一个方法伪装的属性
我是一个类方法
我是一个静态方法
# 其他操作 - (判断,修改,删除)
语法已在上面介绍过了,不多说,直接上代码
class a:
name = "我是一个静态属性"
def __init__(self):
self.user = "我是一个属性"
@property
def so(self):
return "我是一个方法伪装的属性"
@classmethod
def wo(cls):
print("我是一个类方法")
@staticmethod
def ro():
print("我是一个静态方法")
print("我是一个静态方法")
## 判断调用的方法名是否存在,存在返回True,不存在返回False
user = input(">>>")
print(hasattr(a,user))
# 这样子可以做一个if判断,只有存在才会调用
if hasattr(a,user):
print(getattr(a,user))
else:
print("输入错误")
## 修改
print(getattr(a,"name"))
setattr(a,"name","我是一个骚的静态属性")
print(getattr(a,"name"))
## 删除
delattr(a,"name")
print(a.__dict__)
执行结果:
>>>name
True
我是一个静态属性
我是一个静态属性
我是一个骚的静态属性
{'__module__': '__main__', '__init__': <function a.__init__ at 0x000001D2BD4CBAE8>, 'so': <property object at 0x000001D2BD3D7778>, 'wo': <classmethod object at 0x000001D2BD4CAC50>, 'ro': <staticmethod object at 0x000001D2BD4CAC88>, '__dict__': <attribute '__dict__' of 'a' objects>, '__weakref__': <attribute '__weakref__' of 'a' objects>, '__doc__': None}
# 通过反射使用模块
模块是什么:是别人先写好的Python代码文件,使用的时候只需要导入后,直接使用定好的类以及功能方法就行
import os
# 先创建文件名为 1 的文件
# 然后通过反射使用os模块,修改文件名
getattr(os,"rename")("1","2")
# 也可以使用下面的方式
rename = getattr(os,"rename")
rename("2","1")
# 通过反射使用自己当前模块
要使用sys模块才能找到当前py文件的所在内存地址
sys.modules ##查看当前py文件中的所有模块对象的对应关系
class a:
name = "这是一个类"
def b():
print("这是一个函数")
import sys
print(sys.modules)
## 第一种使用方式
getattr(sys.modules["__main__"],"b")()
print(getattr(sys.modules["__main__"].a,"name"))
print(getattr(sys.modules["__main__"],"a").name)
## 第二种使用方式
main = sys.modules["__main__"]
getattr(main,"b")()
print(getattr(main.a,"name"))
print(getattr(main,"a").name)