#用于动态操作对象,但性能开销较大
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')