Python 查看对象属性的几种方式: __dict__, dir(), vars(), locals()

Python026

Python 查看对象属性的几种方式: __dict__, dir(), vars(), locals(),第1张

为了方便用户查看类中包含哪些属性,Python 类提供了 __dict__ 属性。需要注意的一点是,该属性可以用类名或者类的实例对象来调用,用类名直接调用 __dict__ ,会输出该由类中所有类属性组成的字典;而使用类的实例对象调用 __dict__ ,会输出由类中所有实例属性组成的字典。

先来看一下Python类的 __dict__ 属性和类实例对象的 __dict__ 属性,例子如下:

从以上的测试结果中可以得出以下结论:

看几个小例子:

如果没传入参数,就打印当前调用位置的属性和属性值,类似于下面的 locals() 。

locals() 返回调用者当前局部名称空间的字典。在一个函数内部,局部名称空间代表在函数执行时候定义的所有名字, locals() 函数返回的就是包含这些名称的字典。

所说所有的变量都是对象。 对象在python里,其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。\x0d\x0a \x0d\x0a对象通常就是指变量。从面向对象OO的概念来讲,对象是类的一个实例。在python里很简单,对象就是变量。\x0d\x0a \x0d\x0aclass A:\x0d\x0amyname="class a"\x0d\x0a上面就是一个类。不是对象\x0d\x0aa=A()\x0d\x0a这里变量a就是一个对象。\x0d\x0a它有一个属性(类属性),myname,你可以显示出来\x0d\x0aprint a.myname\x0d\x0a \x0d\x0a所以,你看到一个变量后面跟点一个小数点。那么小数点后面就是它的属性或者是方法。带括号的方法。不带就是属性。

在 Python 类的内部,无论是类属性还是实例属性,都是以字典的形式进行存储的,其中属性名作为键,而值作为该键对应的值。

为了方便用户查看类中包含哪些属性,Python 类提供了 dict 属性。需要注意的一点是,该属性可以用类名或者类的实例对象来调用,用类名直接调用 dict ,会输出该由类中所有类属性组成的字典;而使用类的实例对象调用 dict ,会输出由类中所有实例属性组成的字典。

举个例子:

程序输出结果为:

{' module ': ' main ', 'a': 1, 'b': 2, ' init ': <function CLanguage. init at 0x0000022C69833E18>, ' dict ': <attribute ' dict ' of 'CLanguage' objects>, ' weakref ': <attribute ' weakref ' of 'CLanguage' objects>, ' doc ': None}

{'name': 'C语言中文网', 'add': ' http://c.biancheng.net' }

不仅如此,对于具有继承关系的父类和子类来说,父类有自己的 dict ,同样子类也有自己的 dict ,它不会包含父类的 dict 。例如:

运行结果为:

{' module ': ' main ', 'a': 1, 'b': 2, ' init ': <function CLanguage. init at 0x000001721A853E18>, ' dict ': <attribute ' dict ' of 'CLanguage' objects>, ' weakref ': <attribute ' weakref ' of 'CLanguage' objects>, ' doc ': None}

{' module ': ' main ', 'c': 1, 'd': 2, ' init ': <function CL. init at 0x000001721CD15510>, ' doc ': None}

{'name': 'C语言中文网', 'add': ' http://c.biancheng.net' }

{'na': 'Python教程', 'ad': ' http://c.biancheng.net/python' }

除此之外,借助由类实例对象调用 dict 属性获取的字典,可以使用字典的方式对其中实例属性的值进行修改,例如:

程序运行结果为:

{'name': 'C语言中文网', 'add': ' http://c.biancheng.net' }

Python教程