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('处理其他的逻辑')