一:反射
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 = 18print(a.__dict__)#方法二setattr(a,'age',18)print(a.__dict__)#给a对象修改一个属性setattr(a,'name','egon')print(a.__dict__)#给a对象删除一个属性#方法一#del a.age#方法二#delattr(a,'age')