当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
基本类型都可以用type()判断:
print(type(123))
print(type('str'))
print(type(True))
如果一个变量指向函数或者类,也可以用type()判断:
class Animal(object):
pass
a = Animal()
print(type(abs))#指向函数
print(type(a))#指向类
type()函数返回对应的Class类型,如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:
print(type(123)==type(345))
print(type(13)==int)
#判断基本数据类型可以直接写int,str等
#但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
import types
def fn():
pass
print(type(fn)==types.FunctionType)
print(type(abs)==types.BuiltinFunctionType)
print(type(lambda x: x)==types.LambdaType)
print(type((x for x in range(10)))==types.GeneratorType)
使用isinstance()
对于class的继承关系来说,使用type()很不方便,可以使用isinstance()
print(isinstance('a',str))
#基本类型也可以用isinstance()判断:
print(isinstance([1, 2, 3], (list, tuple)))
print(isinstance((1, 2, 3), (list, tuple)))
并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:
总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
使用dir()
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
print(dir('abc'))
类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度
在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,
它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
print(len('abc'))
print('abc'.__len__())
仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
紧接着,可以测试该对象的属性:
print(hasattr(obj,'x'))#有属性'x'吗
print(obj.x)
print(hasattr(obj,'y'))#有属性'y'吗
setattr(obj,'y',19)#设置一个属性y叫19
print(hasattr(obj,'y'))#有属性'y'吗
print(getattr(obj,'y'))#获取属性'y'
#getattr(obj,'z')#获取不存在的属性会报错
print(getattr(obj,'z',404))#可以传入一个值,如果没,就返回值
也可以获得对象的方法:
print(hasattr(obj, 'power')) # 有属性'power'吗?
getattr(obj,'power')#获取属性
fn = getattr(obj,'power')#获取属性'power'并赋值到变量fn
print(fn)# fn指向obj.power
print(fn())#调用fn()与调用obj.power()是一样的
「小结」
通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。
要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息
sum = obj.x + obj.y#可以直接这样写,就绝不要下面的写法
sum = getattr(obj, 'x') + getattr(obj, 'y')
一个正确的例子
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None
假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。
文章来源: 松勤网
-
赞美小朋友跳舞好的句子 观后感 我的生日 赞美孩子做家务的话语 说好不熬夜的句子 安全生产工作总结 感恩演讲稿 围城读后感 比较文艺的昵称 友谊作文 环保口号 微信个性签名 撩妹情话 微信名字有深意 女神生日祝福语 最吸引人的抖音昵称 住院发的文案 手机签名 游戏情侣ID 初一作文600字 班主任工作计划 分手信让对方愧疚想挽留的信 流行网名 送给不懂尊重人的说说 处罚通知书 优雅的文案句子 好看的繁体字 催账的句子发朋友圈 出纳工作总结 遇到你是我很幸运的句子(0) 回复 (0)
-
讨债公司/蓝月传奇辅助/蓝月辅助(0) 回复 (0)
-
讨债公司 搬家公司 蓝月传奇辅助(0) 回复 (0)