当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
使用 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
判断基本数据类型可以直接写 int
,str
等,但如果要判断一个对象是否是函数怎么办?可以使用 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