当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
基本类型都可以用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()就派上了用场。
文章来源: 松勤网
-
啄木鸟开超市三年级作文:https://www.nanss.com/xuexi/13714.html 毕业论文提纲:https://www.nanss.com/xuexi/13230.html 汽车广告策划:https://www.nanss.com/gongzuo/13735.html 加油稿200字:https://www.nanss.com/xuexi/12691.html 情侣昵称大全:https://www.nanss.com/mingcheng/11596.html 女神祝福语简短8字:https://www.nanss.com/wenan/12482.html 六字网名大全:https://www.nanss.com/mingcheng/11759.html 会计从业资格证好考吗:https://www.nanss.com/wenti/11286.html 创卫工作总结:https://www.nanss.com/gongzuo/13082.html 情人节最暖心短句10字:https://www.nanss.com/shenghuo/13924.html 发展对象思想汇报1500字:https://www.nanss.com/xuexi/12659.html 和儿子媳妇在一起高兴说说:https://www.nanss.com/wenan/12182.html 适合女生天冷幽默说说:https://www.nanss.com/wenan/12568.html 忆往昔:https://www.nanss.com/xuexi/12488.html 个人专业发展规划:https://www.nanss.com/gongzuo/13169.html 节假日放假通知:https://www.nanss.com/gongzuo/11202.html 谐音网名:https://www.nanss.com/mingcheng/12186.html 一年级学生评语:https://www.nanss.com/xuexi/11388.html 神笔马良实验作文300字:https://www.nanss.com/xuexi/12477.html 关于车的电影:https://www.nanss.com/wenti/12369.html 课堂礼仪:https://www.nanss.com/xuexi/11293.html 个人自传材料:https://www.nanss.com/xuexi/12652.html 产品推广计划书:https://www.nanss.com/gongzuo/13555.html 感恩老师作文600字:https://www.nanss.com/xuexi/13439.html 女生学什么专业最好:https://www.nanss.com/xuexi/12281.html 卫生主题班会:https://www.nanss.com/xuexi/13409.html 谢谢老公礼物的暖心话:https://www.nanss.com/yulu/11961.html 满满的年味的句子:https://www.nanss.com/yulu/12050.html 高一周记:https://www.nanss.com/xuexi/13891.html 郁闷的心情短语:https://www.nanss.com/yulu/12051.html(0) 回复 (0)
-
赞美小朋友跳舞好的句子 观后感 我的生日 赞美孩子做家务的话语 说好不熬夜的句子 安全生产工作总结 感恩演讲稿 围城读后感 比较文艺的昵称 友谊作文 环保口号 微信个性签名 撩妹情话 微信名字有深意 女神生日祝福语 最吸引人的抖音昵称 住院发的文案 手机签名 游戏情侣ID 初一作文600字 班主任工作计划 分手信让对方愧疚想挽留的信 流行网名 送给不懂尊重人的说说 处罚通知书 优雅的文案句子 好看的繁体字 催账的句子发朋友圈 出纳工作总结 遇到你是我很幸运的句子(0) 回复 (0)
-
讨债公司/蓝月传奇辅助/蓝月辅助(0) 回复 (0)
-
讨债公司 搬家公司 蓝月传奇辅助(0) 回复 (0)