面向对象编程-获取对象信息

获取对象类型

使用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
posted @ 2023-06-15 15:29  鹿丸子  阅读(23)  评论(0)    收藏  举报