面向对象进阶
一:反射
1,python面向对象中的反射就是通过字符串的形式操作对象的相关属性。
2,getattr() 从命名空间中获得这个名字对应的值,找一个属性 ,直接就可以找到这个属性的值,找一个方法 ,找到的是这个方法的内存地址。
3,hasattr() 判断命名空间里有没有这个名字
4,正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值。
class A: role = 'Person' def func(self): print('*'*self) ret = input('>>>') print(A.__dict__[ret]) print(getattr(A,'role')) getattr(A,'func')(1)
class A: role = 'Person' def func(self): print('*'*self) print(hasattr(A,'r')) print(hasattr(A,'role')) print(hasattr(A,'func')) ret = input('>>>') if hasattr(A,ret): print(getattr(A,ret)) # getattr从A的命名空间里找一个属性 ,属性不存在会报错 if hasattr(A,ret): func = getattr(A,ret) func(1)
class A: role = 'Person' def __init__(self): self.money = 500 def func(self): print('*'*10) a = A() print(a.func) getattr(a,'func')() print(getattr(a,'money'))
# import time # 一个py文件就是一个模块 # time.time() # print(time.time()) # print(getattr(time,'time')()) # import os # os.rename('userinfo','user') # getattr(os,'rename')('user','user_info')
def login(): print('执行login功能') def register(): print('执行register功能') import sys # 和python解释器相关的内容都在sys里 print(sys.modules['__main__']) func = input('>>>') if hasattr(sys.modules['__main__'],func): getattr(sys.modules['__main__'],func)()
class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') a = A('alex') #给a对象新增一个属性 #方法一 a.age = 18 print(a.__dict__) #方法二 setattr(a,'age',18) print(a.__dict__) #给a对象修改一个属性 setattr(a,'name','egon') print(a.__dict__) #给a对象删除一个属性 #方法一 #del a.age #方法二 #delattr(a,'age')