2019年8月9日 反射/自省

反射/自省:程序可以访问,检测和修改本身状态或行为的一种能力。

python中提供四种函数:

hasattr(obj,name) 判断obj中有没有一个name字符串对应的方法或者属性

getattr(obj,name(,default))等到obj中name的值

setattr(obj,name,value)设置obj中name的值时value

delattr(obj,name) 删除obj中的name值

class BlackMedium:
    feture='ugly'
    def __init__(self,name1,addr):
        self.name=name1
        self.addr=addr

    def sell_hourse(self):
        print('%s正在卖房'%self.name)

    def rent_hourse(self):
        print('%s租房子'%self.name)


b1=BlackMedium('zyk','sh')
r=hasattr(b1,'name')
print(r)
s=hasattr(b1,'sell_hourse') #在查询b1能不能调用class BlackMedium中的属性
print(s)
w1=getattr(b1,'name') #同b1.name
w2=getattr(b1,'rent_hourse')#没有默认参数,如果没有就会报错
w3=getattr(b1,'abc','没有这个属性')#如果没有,就反馈默认参数
print(w1,w2,w3)#w2是函数地址
w2()

b1.sb=True#上下两个方法都能用,设置与修改的功能
setattr(b1,'sb2',False)
print(b1.__dict__)
del b1.sb
delattr(b1,'sb2')#删除
print(b1.__dict__)

》》》

True
True
zyk <bound method BlackMedium.rent_hourse of <__main__.BlackMedium object at 0x102097dd8>> 没有这个属性
zyk租房子
{'name': 'zyk', 'addr': 'sh', 'sb': True, 'sb2': False}
{'name': 'zyk', 'addr': 'sh'}

class BlackMedium:
    feture='ugly'
    def __init__(self,name1,addr):
        self.name=name1
        self.addr=addr

    def sell_hourse(self):
        print('%s正在卖房'%self.name)

    def rent_hourse(self):
        print('%s租房子'%self.name)


b1=BlackMedium('zyk','sh')
setattr(b1,'func',lambda x:x+1)#定义类func函数,x做参数,返回x+1
print(b1.__dict__)
print(b1.func(3))
setattr(b1,'func2',lambda self:self.name+'sb')#注意调用的是自己
print(b1.func2(b1))

》》》

{'name': 'zyk', 'addr': 'sh', 'func': <function <lambda> at 0x102188f28>}
4
zyksb

hello文件中
class Ftb:
    def __init__(self,addr):
        self.addr=addr
        print('正在上传%s'%addr)

test文件中
from hello import Ftb
#从hello中倒入 Ftb 类
f1=Ftb('12,12,12')
if hasattr(f1,'get'):
    func_get=getattr(f1,'get')
    func_get()
    #f1.get()
else:
    print('不存在get该方法')
    print('处理其他的逻辑')
    # 好处就是不必纠结get方法怎么实现的,以后有get方法了会实施

hello 文件中
#补上get函数
    def get(self):
        print('正在上传文件') 
#反射的应用场景,可插拔设计。

》》》

正在上传12,12,12
正在上传文件

原文地址:https://www.cnblogs.com/python1988/p/11329326.html