#用于动态操作对象,但性能开销较大 class T(): name1 = 'test1' name2 = 'test2' def __init__(self, name4): self.name3 = 'test3' self.name4 = name4 def f1(self): print('f1:', self.name3) #实例化访问 obj_t = T('name4') print(obj_t.name1) # test1 obj_t.f1() # f1: test3 #反射 print(getattr(T, 'name1')) # test1 print(getattr(T, 'f1')) # <function T.f1 at 0x7fc98ba06e50> 输出的对象内存地址 t = T('name4') # 获取动态属性要先实例化,否则不执行实例化的__new__和 __init__ getattr(t, 'f1')() # f1:test3 获取到动态属性可以直接加() 执行 #hasattr() 判断对象属性是否存在,常用getattr()连用 print(hasattr(t, 'name2')) # True if hasattr(T, 'name4'): # 没有实例化,命名空间中没有name4 print(getattr(T, 'name4')) else: print('不存在') if hasattr(t, 'name4'): # 实例化传了变量,结果为true print(getattr(t, 'name4')) # 反射模块 import test print(getattr(test, 'a')) # 1 getattr(test, 'test1')() # test1 obj = getattr(test, 'Test2')('ttt') # 11111 获取类并实例化,执行了__init__,可分开两步写 getattr(obj, 'test2')() # test2 # setattr delattr setattr(test, 'a', 'aaa') print(setattr(test, 'a') # aaa , a=1 被修改 setattr(test, 'c', 'ccc') print(getattr(test, 'c') # ccc , 没有时会新建对象 delattr(test, 'c') # 删除对象
# test a = 1 b = 2 def test1(): print('test1') class Test2(): def __init__(self, c): self.c = c print('11111') def test2(self): print('test2')
标签:__,反射,self,name4,test,getattr,print From: https://www.cnblogs.com/ggsdddup/p/18568735