获取对象信息

拿到一个对象的引用时,怎么判断对象的类型,有哪些方法呢

用type()函数

但如何判断一个对象是否是函数怎么办呢  可以使用types模块中定义的常量

>>> import types
>>> def fn():
...     pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

对于class的继承关系来说,使用type()就会很不方便,这时可以使用isinstance()函数

>>> a = Animal()

然后判断

>>> isinstance(a,Animal)

True

isinstance()判断的是一个对象是否是该类型本身或是位于该类型的父继承链上

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如获得一个str对象的所有属性和方法:

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

__xxx__的属性和方法在python中是特殊的,比如__len__方法返回长度,在python中,如果调用len()函数,获取一个对象的长度,实际上它会自动调用对象的__len()__方法,所以下面的代码是等价的:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

自己的类,如果想用len()函数就可以自己写一个

>>> class MyDog(object):
...     def __len__(self):
...         return 100
...
>>> dog = MyDog()
>>> len(dog)
100

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasatt(),我们可以直接操作一个对象的状态

>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()

紧接着,可以测试该对象的属性

>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19

也可以传入一个default参数,如果属性不存在,返回默认值

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404

也可以获得对象的方法:

>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81

要注意在是,只有在不知道对象信息的时候,我们才会去获取对象信息,如果可以直接写:

sum = obj.x + obj.y

就不要写成

sum = getattr(obj,‘x’)+getattr(obj,‘y’)

一个正确的用法的例子:

def readImage(fp):
    if hasattr(fp, 'read'):
        return readData(fp)
    return None

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值