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 attributes
    of its bases.
  for any other object: its attributes, its class's attributes, and
    recursively the attributes of its class's base classes.
Type:      builtin_function_or_method

dir([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.youkuaiyun.com/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.youkuaiyun.com/xw1680


import math
import time

print(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.youkuaiyun.com/xw1680


names = ['张三','李四','王五']  # 定义一个列表
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.youkuaiyun.com/xw1680


class Student(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age


    def __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.youkuaiyun.com/xw1680

def get_crawl_name():
    pass


def get_crawl_time():
    pass


def 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.youkuaiyun.com/xw1680


import 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_"开头的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棒棒编程修炼场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值