首页 后端开发 Python教程 Python中获取对象信息的方法

Python中获取对象信息的方法

Jun 06, 2016 am 11:26 AM
python

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

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

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

1

2

3

4

5

6

>>> type(123)

<type 'int'>

>>> type('str')

<type 'str'>

>>> type(None)

<type 'NoneType'>

登录后复制

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

1

2

3

4

>>> type(abs)

<type 'builtin_function_or_method'>

>>> type(a)

<class '__main__.Animal'>

登录后复制

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

1

2

3

4

5

6

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

True

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

True

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

False

登录后复制

但是这种写法太麻烦,Python把每种type类型都定义好了常量,放在types模块里,使用之前,需要先导入:

1

2

3

4

5

6

7

8

9

>>> import types

>>> type('abc')==types.StringType

True

>>> type(u'abc')==types.UnicodeType

True

>>> type([])==types.ListType

True

>>> type(str)==types.TypeType

True

登录后复制

最后注意到有一种类型就叫TypeType,所有类型本身的类型就是TypeType,比如:

1

2

>>> type(int)==type(str)==types.TypeType

True

登录后复制

使用isinstance()

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

我们回顾上次的例子,如果继承关系是:

代码如下:

object -> Animal -> Dog -> Husky

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

1

2

3

>>> a = Animal()

>>> d = Dog()

>>> h = Husky()

登录后复制

然后,判断:

1

2

>>> isinstance(h, Husky)

True

登录后复制

没有问题,因为h变量指向的就是Husky对象。

再判断:

1

2

>>> isinstance(h, Dog)

True

登录后复制

h虽然自身是Husky类型,但由于Husky是从Dog继承下来的,所以,h也还是Dog类型。换句话说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。

因此,我们可以确信,h还是Animal类型:

1

2

>>> isinstance(h, Animal)

True

登录后复制

同理,实际类型是Dog的d也是Animal类型:

1

2

>>> isinstance(d, Dog) and isinstance(d, Animal)

True

登录后复制

但是,d不是Husky类型:

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

1

2

3

4

5

6

>>> isinstance('a', str)

True

>>> isinstance(u'a', unicode)

True

>>> isinstance('a', unicode)

False

登录后复制

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

1

2

3

4

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

True

>>> isinstance(u'a', (str, unicode))

True

登录后复制

由于str和unicode都是从basestring继承下来的,所以,还可以把上面的代码简化为:

1

2

>>> isinstance(u'a', basestring)

True

登录后复制

使用dir()

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:

1

2

>>> dir('ABC')

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

登录后复制

类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

1

2

3

4

>>> len('ABC')

3

>>> 'ABC'.__len__()

3

登录后复制

我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法:

1

2

3

4

5

6

7

>>> class MyObject(object):

...   def __len__(self):

...     return 100

...

>>> obj = MyObject()

>>> len(obj)

100

登录后复制

剩下的都是普通属性或方法,比如lower()返回小写的字符串:

1

2

>>> 'ABC'.lower()

'abc'

登录后复制

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

1

2

3

4

5

6

7

>>> class MyObject(object):

...   def __init__(self):

...     self.x = 9

...   def power(self):

...     return self.x * self.x

...

>>> obj = MyObject()

登录后复制

紧接着,可以测试该对象的属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> hasattr(obj, 'x') # 有属性'x'吗?

True

>>> obj.x

9

>>> hasattr(obj, 'y') # 有属性'y'吗?

False

>>> setattr(obj, 'y', 19) # 设置一个属性'y'

>>> hasattr(obj, 'y') # 有属性'y'吗?

True

>>> getattr(obj, 'y') # 获取属性'y'

19

>>> obj.y # 获取属性'y'

19

登录后复制

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

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

1

2

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404

404

登录后复制

也可以获得对象的方法:

1

2

3

4

5

6

7

8

9

>>> hasattr(obj, 'power') # 有属性'power'吗?

True

>>> getattr(obj, 'power') # 获取属性'power'

<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>

>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn

>>> fn # fn指向obj.power

<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>

>>> fn() # 调用fn()与调用obj.power()是一样的

81

登录后复制

小结

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写:

1

sum = obj.x + obj.y

登录后复制

就不要写:

1

sum = getattr(obj, 'x') + getattr(obj, 'y')

登录后复制

一个正确的用法的例子如下:

1

2

3

4

def readImage(fp):

  if hasattr(fp, 'read'):

    return readData(fp)

  return None

登录后复制

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

请注意,在Python这类动态语言中,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
两个点博物馆:所有展览以及在哪里可以找到它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

手机XML转PDF,转换速度快吗? 手机XML转PDF,转换速度快吗? Apr 02, 2025 pm 10:09 PM

手机XML转PDF的速度取决于以下因素:XML结构的复杂性手机硬件配置转换方法(库、算法)代码质量优化手段(选择高效库、优化算法、缓存数据、利用多线程)总体而言,没有绝对的答案,需要根据具体情况进行优化。

有什么手机APP可以将XML转换成PDF? 有什么手机APP可以将XML转换成PDF? Apr 02, 2025 pm 08:54 PM

无法找到一款将 XML 直接转换为 PDF 的应用程序,因为它们是两种根本不同的格式。XML 用于存储数据,而 PDF 用于显示文档。要完成转换,可以使用编程语言和库,例如 Python 和 ReportLab,来解析 XML 数据并生成 PDF 文档。

怎么在手机上把XML文件转换为PDF? 怎么在手机上把XML文件转换为PDF? Apr 02, 2025 pm 10:12 PM

不可能直接在手机上用单一应用完成 XML 到 PDF 的转换。需要使用云端服务,通过两步走的方式实现:1. 在云端转换 XML 为 PDF,2. 在手机端访问或下载转换后的 PDF 文件。

C语言 sum 的作用是什么? C语言 sum 的作用是什么? Apr 03, 2025 pm 02:21 PM

C语言中没有内置求和函数,需自行编写。可通过遍历数组并累加元素实现求和:循环版本:使用for循环和数组长度计算求和。指针版本:使用指针指向数组元素,通过自增指针遍历高效求和。动态分配数组版本:动态分配数组并自行管理内存,确保释放已分配内存以防止内存泄漏。

XML转换成图片的大小如何控制? XML转换成图片的大小如何控制? Apr 02, 2025 pm 07:24 PM

想要通过XML生成图片,需要使用图形库(如Pillow、JFreeChart)作为桥梁,根据XML中的元数据(尺寸、颜色)生成图片。控制图片大小的关键在于调整XML中&lt;width&gt;和&lt;height&gt;标签的值。然而,在实际应用中,XML结构的复杂性、图形绘制的精细度、图片生成的速度和内存消耗,以及图片格式的选择,都对生成的图片大小产生影响,因此需要深入理解XML结构、熟练掌握图形库,以及考虑优化算法和图片格式选择等因素。

xml格式怎么打开 xml格式怎么打开 Apr 02, 2025 pm 09:00 PM

用大多数文本编辑器即可打开XML文件;若需更直观的树状展示,可使用 XML 编辑器,如 Oxygen XML Editor 或 XMLSpy;在程序中处理 XML 数据则需使用编程语言(如 Python)与 XML 库(如 xml.etree.ElementTree)来解析。

XML转换成图片的流程是什么? XML转换成图片的流程是什么? Apr 02, 2025 pm 08:24 PM

XML 转换图片需要先确定 XML 数据结构,再选择合适的图形化库(如 Python 的 matplotlib)和方法,根据数据结构选择可视化策略,考虑数据量和图片格式,进行分批处理或使用高效库,最终根据需求保存为 PNG、JPEG 或 SVG 等格式。

xml格式化工具推荐 xml格式化工具推荐 Apr 02, 2025 pm 09:03 PM

XML格式化工具可以将代码按照规则排版,提高可读性和理解性。选择工具时,要注意自定义能力、对特殊情况的处理、性能和易用性。常用的工具类型包括在线工具、IDE插件和命令行工具。

See all articles