Python 如何查看Python对象的内部?
在Python中,一切皆为对象。在开发过程中,我们经常需要查看某个对象的内部结构,确认其属性、方法以及底层数据结构等信息。本文将介绍几种常见的查看Python对象内部的方法。
阅读更多:Python 教程
print方法
最简单粗暴的查看Python对象的方法就是使用print()
函数。使用print()
函数可以输出任意对象的值,但是不能直接获取该对象的结构信息。例如:
a = [1, 2, 3]
print(a)
输出结果为:[1, 2, 3]
由此可见,使用print()
函数输出列表的值。但是无法知道该列表的内部结构。
help函数
help()
函数是Python的内置函数,它可以获取对象的帮助文档,包括对象的方法和属性等信息。例如:
a = [1, 2, 3]
help(a)
输出结果为:
Help on list object:
class list(object)
| list() -> new empty list
| list(iterable) -> new list initialized from iterable's items
...
由此可以得到,help()
函数可以获取到列表的所有方法和属性,包括构造函数和初始化方法等信息。但是仍然无法获取到该列表的底层数据结构。
dir函数
dir()
函数也是Python的内置函数,它可以获取指定对象的所有属性和方法名称列表。例如:
a = [1, 2, 3]
print(dir(a))
输出结果为:
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__',
'__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count',
'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
由此可以得到,dir()
函数可以获取到列表的所有方法和属性名称。但是仍然无法获取到该列表的底层数据结构。
inspect模块
inspect
模块是Python内置的标准库模块,主要用于获取对象的信息。其中,inspect.getmembers()
函数可以获取对象的所有成员信息。例如:
import inspect
a = [1,2,3]
members = inspect.getmembers(a)
for member in members:
print(member)
输出结果为:
('__add__', <method-wrapper '__add__' of list object at 0x7faac1d8a880>)
('__class__', <class 'list'>)
('__class_getitem__', <method '__class_getitem__' of type object at 0x7faac2d2c2b0>)
('__contains__', <method-wrapper '__contains__' of list object at 0x7faac1d8a880>)
('__delattr__', <method-wrapper '__delattr__' of list object at 0x7faac1d8a880>)
('__delitem__', <method-wrapper '__delitem__' of list object at 0x7faac1d8a880>)
('__dir__', <built-in method __dir__ of list object at 0x7faac1d8a880>)
...
由此可以看到,inspect.getmembers()
函数可以获取到该列表的所有成员,包括属性和方法等信息。但是仍然无法获取到该列表的底层数据结构。
getsizeof函数
sys.getsizeof()
函数可以获取任意Python对象的内存大小,包括该对象的所有子对象和指针等信息。例如:
import sys
a = [1, 2, 3]
print(sys.getsizeof(a))
输出结果为:88
由此可见,上述列表在Python中占用的内存大小为88字节。
__dict__
属性
对于Python中的大多数对象,都有一个__dict__
属性,该属性是一个字典类型,可以用于查看该对象的内部属性。例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('Tom', 18)
print(p.__dict__)
输出结果为:{'name': 'Tom', 'age': 18}
由此可见,__dict__
属性可以获取到该对象的所有属性。
使用第三方库
除了以上方法外,也可以使用第三方库来查看Python对象的内部结构。例如,objgraph
库可以生成对象引用关系图,并通过不同颜色的点来表示不同类型的对象。安装方法为:
pip install objgraph
使用方法为:
import objgraph
a = [1, 2, 3, [4, 5]]
objgraph.show_refs(a, filename='refs.png')
由此可见,使用objgraph
库可以直观地查看对象的引用关系和内部结构。
结论
以上是一些常见的查看Python对象内部结构的方法。不同的方法各有优缺点,可以根据实际需求来选择合适的方法。在实际开发中,了解Python对象的内部结构可以帮助我们更好地理解和调试代码,提高开发效率。