分享

Python获取对象信息之内置函数dir()

 学以致用3 2021-04-26

    对于类对象实例对象,可以调用内置函数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']

从执行结果可看出,加入父类的构造函数后, 该函数查询实例时可以列出实例对象的所有属性和方法,以及父类中的所有方法及属性。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多