python 反射
反射
反射:其实就是用字符串类型的名字去操作变量
这在一些只能拿到字符串类型名字的情况下就极为好用了
反射对象的属性 (用到的关键字:getattr)
class A: #先创建一个类 price = 25 def func(self): #定义一个方法 print('卖橘子啦') a = A() #实例化一个对象 a.name = 'sakura' #给对象添加一个属性 名字=樱花 print(getattr(a,'name')) #getattr(对象,'属性名') 这个属性名一定是字符串形式
sakura
反射对象的方法
class A: #先创建一个类 price = 25 def func(self): #定义一个方法 print('卖橘子啦') a = A() #实例化一个对象 a.name = 'sakura' #给对象添加一个属性 名字=樱花 getattr(a,'func')() #getattr(对象,'方法名')
卖橘子啦
反射类的属性
class A: #先创建一个类 price = 25 def func(self): #定义一个方法 print('卖橘子啦') a = A() #实例化一个对象 a.name = 'sakura' #给对象添加一个属性 名字=樱花 print(getattr(A,'price')) # getattr(类,'属性名')
25
反射类的方法
class A: #先创建一个类 price = 25 def func(self): #定义一个方法 print('卖橘子啦') a = A() #实例化一个对象 a.name = 'sakura' #给对象添加一个属性 名字=樱花 ret = getattr(A,'func') #getattr(类,'方法名') 这样得到的是一个方法的内存地址记得调用 ret(a) #调用一个方法一定要给它传个参数 getattr(A,'func')(a) #这个是上面那个的简写形式
卖橘子啦
卖橘子啦
如果调用类中没有的属性或方法,程序报错怎么办
这时候就要用到一个和getattr配套使用的 hasattr
class A: #先创建一个类 price = 25 def func(self): #定义一个方法 print('卖橘子啦') a = A() #实例化一个对象 a.name = 'sakura' #给对象添加一个属性 名字=樱花 if hasattr(A,'funs'): # 作用就是判断类中有没有这个方法 如果有就执行下一步 getattr(A,'funs')(a) #这个是上面那个的简写形式
可以看见 程序并没有报错 也就是没有执行funs方法
除此之外,还能反射模块中的方法和属性
反射自己模块中的变量和函数
def funs(): #写一个简单的函数 print('你站在这里不要走动,我去给你把橘子树搬来')
现在 有了一个函数,那该怎么调用它呢
import sys #使用sys模块 def funs(): #写一个简单的函数 print('你站在这里不要走动,我去给你把橘子树搬来') year = 8102 print(sys.modules['__main__']) #这样就能调用自己的模块了 (在内存中自己写的没有使用的模块都叫__main__) # 现在知道自己写的函数就是sys.modules['__main__'] print(getattr(sys.modules['__main__'],'year'))
打印出来第一个是:一个函数的内存地址
第二个是:8102
import sys #使用sys模块 def funs(): #写一个简单的函数 print('你站在这里不要走动,我去给你把橘子树搬来') year = 8102 getattr(sys.modules['__main__'],'funs')() #这样就可以调用这个函数了 getattr(sys.modules[__name__],'funs')() # 有些情况下 函数名字也会改变之类的, 所以把它设成变量更好
你站在这里不要走动,我去给你把橘子树搬来
你站在这里不要走动,我去给你把橘子树搬来
设置修改变量
class Circle: #创建一个类 pass a = Circle() #实例化一个对象 a.name = 'sakura' #给这个对象一个属性 名字=樱花 print(a.name) setattr(a,'name','dark') #用setattr修改name的值 print(a.name)
sakura
dark
可以看见name的值被修改了
删除一个变量
class Circle: print('这个是橘子树') a = Circle()
这个是橘子树
现在有一个类和一个对象
class Circle: print('这个是橘子树') a = Circle() delattr(Circle,'a') #delattr(类或对象,'属性名')
这样就把类中的a对象删除了