拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法?
目录
type()
isinstance()
dir()
type()
type()函数返回对应的Class类型。判断一个对象是否是函数用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的类型,可以使用
isinstance()
函数。
isinstance()
判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。
如这里Student是Person的子类:
person1 = Person('liwei',22,164)
stu1 = Student('forest',23,165)
print(isinstance(stu1,Student))
print(isinstance(stu1,Person))
print(isinstance(person1,Student))
print(isinstance(person1,Person))
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMwITOykTM1ATMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
可以看到stu1既是Student类,又是Person类;person1只是Person类,不是Student类
还可以判断一个变量是否是某些类型中的一种:
person1 = Person('liwei',22,164)
stu1 = Student('forest',23,165)
print(isinstance(stu1, (Person, Student)))
print(isinstance(stu1, (int, str)))
dir()
通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。
要获得一个对象的所有属性和方法,可以使用
dir()
函数,它返回一个包含字符串的list,包含了该对象的所有属性和方法。
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
类似
__xxx__
的属性和方法在Python中都是有特殊用途的,比如
__len__
方法返回长度。在Python中,如果你调用
len()
函数试图获取一个对象的长度,实际上,在
len()
函数内部,它自动去调用该对象的
__len__()
方法。
合
getattr()
、
setattr()
以及
hasattr()
,我们可以直接操作一个对象的状态。
hasattr(obj,'a') 判断obj对象是否有属性/方法a (注意,不能判断出私有属性/方法)
getattr(obj,'a') 获取obj对象的属性/方法a的值(如果获取一个不存在的属性/方法,会返回一个错误AttributeError。为避免出错导致程序停止,可以传入一个default参数 getattr(obj, 'a', 404),如果属性/方法a不存在,就返回默认值404)
setattr(obj,'a',100) 设置obj对象的属性/方法a的值
如下,person1对象的属性主要有 'high',方法主要有'print_name', 'print_age',运行结果入下