Python获取对象信息之内置函数dir()
对于类对象或实例对象,可以调用内置函数dir()获取其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表。类对象与实例对象的结果是有区别的,类对象的结果不包括实例属性。
示例:
#coding=gbk
class A(B):
def __init__(self,x):
self.x=x
self.y=15
def aa(self):
pass
def cc(self):
self.j=0
pass
def bb(self):
pass
ali=A(20)
print(dir(ali)) #也可以写成print(dir(A(10)))
print(dir(A))
执行结果:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc', 'x', 'y']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc']
从执行结果看出,该函数查询实例时可以列出实例对象的所有属性和方法,但cc函数中的f属性不显示。查询类时可以列出对象的所有方法,但不列出属性。
类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
>>> len('ABC')
>>> 'ABC'.__len__()
如果在有继承的关系下示例如下:
#coding=gbk
class B():
def __init__(self,z):
self.z=z
self.w=1
def ee(self):
pass
class A(B):
def __init__(self,x):
self.x=x
self.y=15
def aa(self):
pass
def cc(self):
self.j=0
pass
def bb(self):
pass
ali=A(20)
print(dir(ali)) #也可以写成print(dir(A(10)))
print(dir(A))
执行结果如下:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc', 'ee', 'x', 'y']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc', 'ee']
从执行结果可看出:
该函数查询实例时可以列出实例对象的所有属性和方法,以及父类中的所有方法,但不列出父类的属性,查询类时可以列出对象及父类的所有方法,但不列出属性。
将子类加入super().__init__()函数引入父类的构造函数
#coding=gbk
class B():
def __init__(self,z):
self.z=z
self.w=1
def ee(self):
pass
class A(B):
def __init__(self,x):
super().__init__(2)
self.x=x
self.y=15
def aa(self):
pass
def cc(self):
self.j=0
pass
def bb(self):
pass
ali=A(20)
print(dir(ali)) #也可以写成print(dir(A(10)))
print(dir(A))
执行结果如下:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc', 'ee', 'w', 'x', 'y', 'z']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb', 'cc', 'ee']
从执行结果可看出,加入父类的构造函数后, 该函数查询实例时可以列出实例对象的所有属性和方法,以及父类中的所有方法及属性。