获取对象类型
使用type()
type(123)
<class 'int'>
type('str')
<class 'str'>
type(None)
<type(None) 'NoneType'>
type(abs)
<class 'builtin_function_or_method'>
type(a)
<class '__ main__.Animal'>
判断一个对象是否是函数,可以用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
使用isinstance()
若继承关系是:
object -> Animal -> Dog -> Husky
先创建3种类型对象
a = Animal()
d = Dog()
h = Husky()
判断:
isinstance(h, Husky)
True
可以判断某个变量是否为某种类型的一种
isinstance([1, 2, 3], (list, tuple))
True
isinstance((1, 2, 3), (list, tuple))
True
总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
使用dir()
若要获取一个对象的所有属性和方法,可以使用dir()函数,它返回一个list
dir('ABC')
['add', 'class',..., 'subclasshook', 'capitalize', 'casefold',..., 'zfill']
调用len()函数获取某个对象那个的长度,实际上在len()函数的内部它自动调用了该对象的__ len__()方法,所以下面代码等价
len('ABC')
3
'ABC'.__ len__()
3
我们自己写的类如果def了一个__ len__()方法,那么也可以用len(myobject)
点击查看代码
class MyDog(object):
... def __len__(self):
... return 100
...
dog = MyDog()
len(dog)
100
只获取属性和方法是不够的,还需配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。
点击查看代码
# 测试该对象的属性
# 有没有xx属性:hasattr
print(hasattr(obj,'x'))
print(obj.x)
print(hasattr(obj,'y'))
# 设置属性:setattr()
setattr(obj,'y','hh')
print(hasattr(obj,'y'))
print(obj.y)
# 获取属性:getattr()
print(getattr(obj,'y'))
运行结果
True
9
False
True
hh
hh
若试图获取不存在的属性:
getattr(obj, 'z') # 获取属性'z'
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'MyObject' object has no attribute 'z'
可以传入一个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
总结:
上述方法是在我们不知道对象信息时候才会用,比如:
点击查看代码
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None