dir() 函数是 Python 的内置工具,我们主要用它来列出对象的属性(例如方法、变量等)。在开发和调试过程中,它能帮助我们检查模块、类、函数,甚至是我们自己定义的对象。
语法
> dir([object])
参数:
- object (可选): 任何 Python 对象(例如列表、字典、类、模块等)。
返回类型: 返回一个名称列表(字符串),代表了该对象的属性或当前作用域内的内容。
行为表现
- 不带参数时: 列出当前局部作用域内的名称。
- 用于模块时: 列出所有可用的函数、类和常量。
- 用于用户自定义对象时: 列出所有属性,包括用户自定义的属性(如果定义了 dir 方法)。
- 用于内置对象时: 列出所有有效的属性和方法。
示例:dir() 函数的应用
示例 1:不传递参数
在这个例子中,我们使用 dir() 函数来列出当前 Python 环境中的对象属性和方法。这能让我们直观地探索当前作用域下可用的函数和对象。
Python
CODEBLOCK_d4a9ac99
输出结果:
> [‘annotations‘, ‘builtins‘, ‘doc‘, ‘loader‘, ‘name‘, ‘package‘, ‘spec‘, ‘traceback‘]
>
> [‘annotations‘, ‘builtins‘, ‘doc‘, ‘loader‘, ‘name‘, ‘package‘, ‘spec‘, ‘math‘, ‘random‘, ‘traceback‘]
原理解析:
- dir() 会列出当前局部作用域内的名称。
- 请注意,在导入模块后,输出列表中包含了 random 和 math,而在导入之前这些名称是不存在的。
示例 2:传递模块对象
这个例子向我们展示了如何利用 dir() 来探索某个模块(例如 random)内部的所有属性。
Python
CODEBLOCK_ed79aea2
输出结果:
> Attributes in random module:
>
> [‘BPF‘, ‘LOG4‘, ‘NVMAGICCONST‘, ‘RECIPBPF‘, ‘Random‘, ‘SGMAGICCONST‘, ‘SystemRandom‘, ‘TWOPI‘, ‘ONE‘, ‘Sequence‘, ‘all‘, ‘builtins‘, ‘cached‘, ‘doc‘, ‘file‘, ‘loader‘, ‘name‘, ‘package‘, ‘spec‘, ‘accumulate‘, ‘acos‘, ‘bisect‘, ‘ceil‘, ‘cos‘, ‘e‘, ‘exp‘, ‘fabs‘, ‘floor‘, ‘index‘, ‘inst‘, ‘isfinite‘, ‘lgamma‘, ‘log‘, ‘log2‘, ‘os‘, ‘pi‘, ‘random‘, ‘repeat‘, ‘sha512‘, ‘sin‘, ‘sqrt‘, ‘test‘, ‘testgenerator‘, ‘urandom‘, ‘warn‘, ‘betavariate‘, ‘binomialvariate‘, ‘choice‘, ‘choices‘, ‘expovariate‘, ‘gammavariate‘, ‘gauss‘, ‘getrandbits‘, ‘getstate‘, ‘lognormvariate‘, ‘normalvariate‘, ‘paretovariate‘, ‘randbytes‘, ‘randint‘, ‘random‘, ‘randrange‘, ‘sample‘, ‘seed‘, ‘setstate‘, ‘shuffle‘, ‘triangular‘, ‘uniform‘, ‘vonmisesvariate‘, ‘weibullvariate‘]
原理解析: 传入 random 模块后,dir() 列出了该模块中所有可用的常量、函数和类。
示例 3. 当列表对象作为参数传递时
在这里,我们将一个列表和一个字典传递给 dir(),以此来查看它们各自支持的方法。
Python
CODEBLOCK_35e0db68
输出结果:
> [‘add‘, ‘class‘, ‘classgetitem‘, ‘contains‘, ‘delattr‘, ‘delitem‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattribute‘, ‘getitem‘, ‘getstate‘, ‘gt‘, ‘hash‘, ‘iadd‘, ‘imul‘, ‘init‘, ‘initsubclass‘, ‘iter‘, ‘le‘, ‘len‘, ‘lt‘, ‘mul‘, ‘ne‘, ‘new‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘reversed‘, ‘rmul‘, ‘setattr‘, ‘setitem‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘append‘, ‘clear‘, ‘copy‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘, ‘sort‘]
> [‘class‘, ‘classgetitem‘, ‘contains‘, ‘delattr‘, ‘delitem‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattribute‘, ‘getitem‘, ‘getstate‘, ‘gt‘, ‘hash‘, ‘init‘, ‘initsubclass‘, ‘ior‘, ‘iter‘, ‘le‘, ‘len‘, ‘lt‘, ‘ne‘, ‘new‘, ‘or‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘reversed‘, ‘ror‘, ‘setattr‘, ‘setitem‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘clear‘, ‘copy‘, ‘fromkeys‘, ‘get‘, ‘items‘, ‘keys‘, ‘pop‘, ‘popitem‘, ‘setdefault‘, ‘update‘, ‘values‘]
原理解析:
- dir(my_list) 返回了列表对象可用的所有方法(例如 append, sort 等)。
- dir(my_dict) 返回了字典对象可用的所有方法(例如 keys, values 等)。
示例 4. 当用户自定义对象作为参数传递时
我们可以定义自己的类,并通过实现 dir() 方法来自定义 dir() 的返回内容。
Python
CODEBLOCK_3f491621
输出结果
[‘item‘, ‘price‘, ‘quantity‘]
*