Python内置函数dir详解


Posted in Python onApril 14, 2015

1.命令介绍

最近学习并使用了一个python的内置函数dir,首先help一下:

>>> help(dir)

Help on built-in function dir in module __builtin__:


dir()

    dir([object]) -> list of strings


    Return an alphabetized list of names comprising (some of) the attributes

    of the given object, and of attributes reachable from it:


    No argument:  the names in the current scope.

    Module object:  the module attributes.

    Type or class object:  its attributes, and recursively the attributes of

        its bases.

    Otherwise:  its attributes, its class's attributes, and recursively the

        attributes of its class's base classes.

通过help,可以简单的认为dir列出指定对象或类的属性。
2.实例
下面是一个简单的测试:
 class A:

     def a(self):

         pass

 

 

 class A1(A):

    def a1(self):

        pass


if __name__ == '__main__':

    print("dir without arguments:", dir())

    print("dir class A:", dir(A))

    print("dir class A1:", dir(A1))

    a = A1()

    print("dir object a(A1):", dir(a))

    print("dir function a.a:", dir(a.a))

测试结果:
dir without arguments: ['A', 'A1', '__builtins__', '__doc__', '__file__', '__name__', '__package__']

dir class A: ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']

dir class A1: ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'a1']

dir object a(A1): ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'a1']

dir function a.a: ['__call__', '__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

3.使用dir查找module下的所有类
最初使用这个函数的初衷,就是在一个module中查找实现的类名,通过该函数可以很容易的实现。
比如把上面的测试程序保存为A.py,再建一个测试程序,内容如下:
import A
if __name__ == '__main__':

    print("dir module A:", dir(A))

结果如下:
dir module A: ['A', 'A1', '__builtins__', '__doc__', '__file__', '__name__', '__package__']

可以看出class A和A1都能够找到。

4.如何找到当前模块下的类

这是一个烦恼较长时间的一个问题,也没有搜到详细的解决方法,下面是我的集中实现方法。

4.1.方法一:在module下面直接调用

比如在上面的A.py最下面添加一行,即可在后续的代码中可以使用selfDir来查找当前的module下的类,修改后的代码如下:

 class A:

     def a(self):

         pass

 

 class A1(A):

     def a1(self):

         pass

 

 curModuleDir=dir()  # get dir of current file(module)
if __name__ == '__main__':

    print("dir without arguments:", dir())

    print("dir class A:", dir(A))

    print("dir class A1:", dir(A1))

    a = A1()

    print("dir object a(A1):", dir(a))

    print("dir function a.a:", dir(a.a))

    print("dir current file:", curModuleDir)

4.2.方法二:import当前module
把当前module和别的import一样引用,代码如下:

 # A.py

 import A as this # import current module

 

 class A:

     def a(self):

         pass

 

 class A1(A):

     def a1(self):

        pass
if __name__ == '__main__':

    print("dir without arguments:", dir())

    print("dir class A:", dir(A))

    print("dir class A1:", dir(A1))

    a = A1()

    print("dir object a(A1):", dir(a))

    print("dir function a.a:", dir(a.a))

    print("dir current file:", dir(this))

4.3.方法三:根据module名称查找module,然后调用dir
我们知道module下面有个属性__name__显示module名称,怎么能够根据module名称来查找module对象呢?可以借助sys.modules。代码如下:
import sys
class A:

    def a(self):

        pass
class A1(A):

    def a1(self):

        pass
if __name__ == '__main__':

    print("dir without arguments:", dir())

    print("dir class A:", dir(A))

    print("dir class A1:", dir(A1))

    a = A1()

    print("dir object a(A1):", dir(a))

    print("dir function a.a:", dir(a.a))

    print("dir current file:", dir(sys.modules[__name__])) # 使用__name__获取当前module对象,然后使用对象获得dir
Python 相关文章推荐
Python实现list反转实例汇总
Nov 11 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python实现kMeans算法
Dec 21 Python
Python requests发送post请求的一些疑点
May 20 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
详解爬虫被封的问题
Apr 23 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
Python类中方法getitem和getattr详解
Aug 30 Python
flask框架中的cookie和session使用
Jan 31 Python
python中tkinter复选框使用操作
Nov 11 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 #Python
Python isinstance函数介绍
Apr 14 #Python
Python with用法实例
Apr 14 #Python
详细探究Python中的字典容器
Apr 14 #Python
Python中decorator使用实例
Apr 14 #Python
用Python创建声明性迷你语言的教程
Apr 13 #Python
Python中的Numeric包和Numarray包使用教程
Apr 13 #Python
You might like
php预定义常量
2006/12/25 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
跟我学Laravel之视图 & Response
2014/10/15 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
Textarea根据内容自适应高度
2013/10/28 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
js自定义回调函数
2015/12/13 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
纯javascript版日历控件
2016/11/24 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
Python PyQt5标准对话框用法示例
2017/08/23 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
Sony C++笔试题
2013/03/10 面试题
园林技术个人的自我评价
2014/02/15 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
行政内勤岗位职责
2014/04/07 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫