反射

#用于动态操作对象,但性能开销较大

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')

 

posted @ 2024-11-25 21:01  尐少  阅读(8)  评论(0)    收藏  举报