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.实例
下面是一个简单的测试:
1
class
A:
2
def
a(self):
3
pass
4
5
6
class
A1(A):
7
def
a1(self):
8
pass
9
10
11
if
__name__
==
'
__main__
'
:
12
print
(
"
dir without arguments:
"
, dir())
13
print
(
"
dir class A:
"
, dir(A))
14
print
(
"
dir class A1:
"
, dir(A1))
15
a
=
A1()
16
print
(
"
dir object a(A1):
"
, dir(a))
17
print
(
"
dir function a.a:
"
, dir(a.a))
18

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

测试结果:
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,再建一个测试程序,内容如下:
1
import
A
2
3
4
if
__name__
==
'
__main__
'
:
5
print
(
"
dir module A:
"
, dir(A))
6

2

3

4

5

6

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


可以看出class A和A1都能够找到。
4.如何找到当前模块下的类
这是一个烦恼较长时间的一个问题,也没有搜到详细的解决方法,下面是我的集中实现方法。
4.1.方法一:在module下面直接调用
比如在上面的A.py最下面添加一行,即可在后续的代码中可以使用selfDir来查找当前的module下的类,修改后的代码如下:
4.2.方法二:import当前module
把当前module和别的import一样引用,代码如下:
我们知道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
1
class
A:
2
def
a(self):
3
pass
4
5
class
A1(A):
6
def
a1(self):
7
pass
8
9
curModuleDir
=
dir()
#
get dir of current file(module)
10
11
if
__name__
==
'
__main__
'
:
12
print
(
"
dir without arguments:
"
, dir())
13
print
(
"
dir class A:
"
, dir(A))
14
print
(
"
dir class A1:
"
, dir(A1))
15
a
=
A1()
16
print
(
"
dir object a(A1):
"
, dir(a))
17
print
(
"
dir function a.a:
"
, dir(a.a))
18
print
(
"
dir current file:
"
, curModuleDir)
19

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

4.2.方法二:import当前module
把当前module和别的import一样引用,代码如下:
1
#
A.py
2
import
A as this
#
import current module
3
4
class
A:
5
def
a(self):
6
pass
7
8
class
A1(A):
9
def
a1(self):
10
pass
11
12
if
__name__
==
'
__main__
'
:
13
print
(
"
dir without arguments:
"
, dir())
14
print
(
"
dir class A:
"
, dir(A))
15
print
(
"
dir class A1:
"
, dir(A1))
16
a
=
A1()
17
print
(
"
dir object a(A1):
"
, dir(a))
18
print
(
"
dir function a.a:
"
, dir(a.a))
19
print
(
"
dir current file:
"
, dir(this))
4.3.方法三:根据module名称查找module,然后调用dir

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

我们知道module下面有个属性__name__显示module名称,怎么能够根据module名称来查找module对象呢?可以借助sys.modules。代码如下:

















