Python 常用内置函数详解(七):dir()函数——获取当前本地作用域中的名称列表或对象的有效属性列表
目录
- 一、功能
- 二、语法和示例
一、功能
dir() 函数获取当前本地作用域中的名称列表或对象的有效属性列表。
二、语法和示例
dir() 函数有两种形式,如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表。如果对象有一个名为 __dir__()
的方法,那么该方法将被调用,并且必须返回一个属性列表。dir()函数的语法格式如下:
C:\Users\amoxiang>ipython
Python 3.12.8 (tags/v3.12.8:2dc476b, Dec 3 2024, 19:30:04) [MSC v.1942 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.32.0 -- An enhanced Interactive Python. Type '?' for help.In [1]: dir?
Docstring:
Show attributes of an object.If called without an argument, return the names in the current scope.
Else, return an alphabetized list of names comprising (some of) the attributes
of the given object, and of attributes reachable from it.
If the object supplies a method named __dir__, it will be used; otherwise
the default dir() logic is used and returns:for a module object: the module's attributes.for a class object: its attributes, and recursively the attributesof its bases.for any other object: its attributes, its class's attributes, andrecursively the attributes of its class's base classes.
Type: builtin_function_or_methoddir([object])
参数说明:
1.object: 对象。该参数为可选参数
2.返回值: 如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,则会返回所有属性和方法,甚至是所有对象默认的内置属性
【示例1】对比导入模块前后的dir()函数返回列表。使用dir()函数输出当前本地作用域中的名称列表,然后导入random和math模块,最后使用dir()函数输出名称列表。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:28
# @Author : AmoXiang
# @File : dir_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680# ['__annotations__', '__builtins__', '__cached__', '__doc__',
# '__file__', '__loader__', '__name__', '__package__', '__spec__']
print(dir()) # 输出当前本地作用域中的名称列表import random # 导入random模块
import math # 导入math 模块
# ['__annotations__', '__builtins__', '__cached__', '__doc__',
# '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math', 'random']
# 对比输出结果发现,导入random和math 模块后,dir()函数返回结果列表中多了"math"和"random"2个元素。
print(dir()) # 输出当前本地作用域中的名称列表
【示例2】将模块名作为参数传递给dir()函数,输出该模块的属性列表。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:28
# @Author : AmoXiang
# @File : dir_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680import math
import timeprint(dir(math)) # 输出math模块属性名称列表
print(dir(time)) # 输出time模块属性名称列表# 使用dir(list)会返回列表的所有属性
print([a for a in dir(list) if re.match(r'__\w{,2}__',a)]) # 使用正则表达式,匹配所有包含__**__形式的属性
print([a for a in dir(list) if 're' in a]) # 使用in关键字过滤所有包含"re"字符的属性
【示例3】将不同类型的对象名作为参数传递给dir()函数,输出该模块的属性列表。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:28
# @Author : AmoXiang
# @File : dir_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680names = ['张三','李四','王五'] # 定义一个列表
info = {'name':'张三','age':18} # 定义一个字典
print(dir(names)) # 输出列表的属性
print(dir(info)) # 输出字典的属性
【示例4】将自定义类对象作为参数传递给dir()函数。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:28
# @Author : AmoXiang
# @File : dir_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680class Student(object):def __init__(self, name, age):self.name = nameself.age = agedef __dir__(self):'''定义__dir__函数,返回列表'''print('__dir__~~~')# return None TypeError: 'NoneType' object is not iterable# return ['amo', 'jerry', 'paul']return {1}s1 = Student('amo', 18) # 实例化Student类
print(dir(s1)) # 将实例名称作为参数,传递给调用dir()函数 ==> [1]
print(type(dir(s1))) # <class 'list'>
print(dir(Student))
【示例5】执行模块中指定的函数。创建一个module_a.py文件,代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:57
# @Author : AmoXiang
# @File : module_a.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680def get_crawl_name():passdef get_crawl_time():passdef crawl_sina():'''爬取新浪'''print('正在爬取新浪数据')def crawl_wechat():'''爬取微信'''print('正在爬取微信数据')def crawl_weibo():'''爬取微博'''print('正在爬取微博数据')def crawl_toutiao():'''爬取头条'''print('正在爬取头条数据')
创建 run.py 文件,使用 import 语句导入 module_a 模块,然后使用 dir() 函数获取模块中的所有属性,如果该属性是以 crawl_
开头,则调用该函数。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025-05-01 7:58
# @Author : AmoXiang
# @File : run.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680import module_a # 导入模块list_from_a = dir(module_a) # 获取模块中所有属性
print(list_from_a)for mod in list_from_a: # 遍历所有属性if mod.startswith('crawl_'): # 判断属性名是否以"crawl_"开头f = getattr(module_a, mod) # 获取对象中以"crawl_"开头的属性值f() # 调用以"crawl_"开头的方法