python学习之自省/反射

自省/反射
自省也称作反射,这个性质展示了某对象是如何在运行期取得自身信息的。如果传一个对象给你,
你可以查出它有什么能力,这是一项强大的特性。如果Python不支持某种形式的自省功能,dir和
type内建函数,将很难正常工作。还有那些特殊属性,像__dict__,__name__及__doc__

class myClass(object):
    def __init__(self):
        self.foo = 100
    
    def bar(self):
        print("print bar")


myInst = myClass()
print(hasattr(myInst, 'foo'))  # 实例类对象是否有foo属性,返回布尔值
print(getattr(myInst, 'foo'))  # 从实例类对象里取出foo属性的值
print(hasattr(myInst, 'bar'))  # 实例类对象是否有bar函数,返回布尔值
print(getattr(myInst, 'errorbar', 'oops!'))  # 第一个参数实例,第二个参数是否有errorbar属性
# 如果没有这个属性,默认打印oops,没有默认参数抛异常
print(getattr(myInst, 'bar', 'oops!'))  # 第二个参数存在,返回对象的内存地址
setattr(myInst, 'b', 'test123')  # 设置一个新实例属性,第一个参数实例,第二个参数属性,第三参数属性值
setattr(myInst, 'age', lambda self: self.foo + 200)
delattr(myInst, 'b')  # 删除一个实例的属性
print((dir(myClass)))
print(dir(myInst))
print(dir())
print(dir(myInst.foo))
print(myInst.__dict__)
print(myInst.age(myInst))

例子2:
class FtpClient:
    'ftp客户端,但是还么有实现具体的功能'
    def __init__(self,addr):
        print('正在连接服务器[%s]' %addr)
        self.addr=addr
        
#from module import FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
    func_get=getattr(f1,'get')
    func_get()
else:
    print('---->不存在此方法')
    print('处理其他的逻辑')

posted on 2020-04-20 03:18  秋雨的蝴蝶  阅读(134)  评论(0编辑  收藏  举报