获取对象信息

当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?




使用 type()

首先,我们来判断对象类型,使用 type() 函数。

基本类型都可以用 type() 判断:

>>> type(123)


>>> type('str')


>>> type(None)

如果一个变量指向函数或者类,也可以用 type() 判断:

>>> type(abs)
 # 内建函数

>>> bart = Student('Bart Simpson', 59)
>>> type(bart)
 # 属于 Student 类

type() 函数返回的是对应的 Class 类型。如果我们要在 if 语句中判断,就需要比较两个变量的 type 类型是否相同:

>>> type(123 )== type(456)
True

>>> type(123 )== int
True

>>> type('abc') == type('123')
True

>>> type('abc') == str
True

>>> type('abc') == type(123)
False

判断基本数据类型可以直接写 intstr 等,但如果要判断一个对象是否是函数怎么办?可以使用 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()

对于 class 的继承关系来说,使用 type() 就很不方便。我们要判断 class 的类型,可以使用 isinstance() 函数。

我们有 Student 类的继承关系如下:

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('{}: {}'.format(self.__name, self.__score))


class HightSchoolStudent(Student):
    pass


class ClassOneStudent(HightSchoolStudent):
    pass

那么,isinstance() 就可以告诉我们,一个对象是否是某种类型。先创建 3 种类型的对象:

>>> a = Student('a', 60)
>>> b = HightSchoolStudent('b', 60)
>>> c = ClassOneStudent('c', 60)

测试一下:

>>> isinstance(c, ClassOneStudent)
True

>>> isinstance(c, HightSchoolStudent)
True

>>> isinstance(c, Student)
True

>>> isinstance(b, ClassOneStudent)
False

能用 type() 判断的基本类型也可以用 isinstance() 判断:

>>> isinstance('a', str)
True

>>> isinstance(123, int)
True

>>> isinstance(b'a', bytes)
True

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是 list 或者 tuple

>>> isinstance([1, 2, 3], (list, tuple))
True

>>> isinstance((1, 2, 3), (list, tuple))
True




getattr()、setattr() 和 hasattr()

使用 getattr()setattr() 以及 hasattr(),我们可以直接操作一个对象的状态:

>>> bart = Student('bart', 60)

>>> hasattr(bart, 'name') # 是否有 name 属性
True

>>> hasattr(bart, 'age') # 是否有 age属性
False

>>> setattr(bart, 'age', 12) # 设置一个 age 属性
>>> bart.age
12

>>> getattr(bart, 'age') # 获取 age 属性
13

如果试图获取不存在的属性,会抛出 AttributeError 的错误:

>>> getattr(bart, 'address')
.......
AttributeError: 'Student' object has no attribute 'address'

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

>>> getattr(bart, 'address', 'default address')
'default address'

也可以获得对象的方法:

>>> hasattr(bart, 'print_score') # 是否存在 print_score 方法
True

>>> getattr(bart, 'print_score') # 获得 print_score 方法
>

>>> fn = getattr(bart, 'print_score')
>>> fn()
bart: 60

你可能感兴趣的:(获取对象信息)