【Python入门教程】第67篇 私有函数

本文详细介绍了如何在Python中使用下划线前缀定义私有函数,并利用__all__变量来控制模块导出的功能。学习如何创建私有函数以保护模块内部实现,同时保持对外部的接口控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇我们学习如何使用 __all__ 变量定义模块中的私有函数(private function)。

使用下划线前缀定义私有函数

假如存在以下 mail.py 模块,其中包含两个函数 send() 和 attach_file()。

def send(email, message):
    print(f'Sending "{message}" to {email}')

def attach_file(filename):
    print(f'Attach {filename} to the message')

我们只想将 send() 函数暴露给其他模块。或者说,我们想要将 attach_file() 定义为私有函数,mail 模块之外的代码无法访问到该函数。作为演示,我们只是在这两个函数中打印了一些信息。

如果其他模式使用了下面的导入语句:

from mail import *

我们可以在函数名前面加上一个下划线(_),表示定义私有函数。例如:

def send(email, message):
    print(f'Sending "{message}" to {email}')

def _attach_file(filename):
    print(f'Attach {filename} to the message')

在其他文件中,我们可以使用 import 语句导入 mail 模块,但是只能看到 send() 函数:

from mail import *


send('test@example.com','Hello')

也就是说,我们不能在其他模块中访问 _attach_file() 函数;否则,将会返回错误。

使用 __all__ 变量定义私有函数

将 attach_file() 函数定义为私有函数的另一个放就是使用 __all__ 变量。这种方法定义的私有函数不需要使用下划线前缀。

__all__ 变量指定了一个在其他模块中可见的函数(变量以及其他对象)列表。也就是说,不在该变量中的函数就是私有函数。

以下示例在 mail 模块中使用 __all__ 变量将 send() 定义为公有函数,同时将 attach_file() 定义为私有函数:

# mail.py

__all__ = ['send']

def send(email, message):
    print(f'Sending "{message}" to {email}')

def attach_file(filename):
    print(f'Attach {filename} to the message')

同样,main.py 模块中无法访问 attach_file() 函数:

# main.py

from mail import *


send('test@example.com','Hello')

在前面的模块教程中我们提醒过,import * 并不是一个好的习惯,可能会导致一些问题。不过,我们仍然可用在包中使用这种语法。

首先,创建一个包含 __init__.py 文件的包 mail,然后在其中创建一个 email.py 模块:

├── mail
|  ├── email.py
|  └── __init__.py
└── main.py

其次,将以下代码写入 email.py 文件:

# email.py

__all__ = ['send']


def send(email, message):
    print(f'Sending "{message}" to {email}')


def attach_file(filename):
    print(f'Attach {filename} to the message')

最后,在 __init__.py 文件中使用 import * 语句将 send() 函数添加到t __all__ 变量中:

from .email import * 

__all__ = email.__all__

这样一来,mail 包只对外暴露了 email.__all__ 变量中的 send() 函数,隐藏了 attach_file() 函数。

在 main.py 文件中可用使用以下代码导入 mail 包并使用 send() 函数:

# main.py

import mail


mail.send('test@example.com','Hello')

或者也可以直接导入 mail 包中的 send() 函数:

# main.py

from mail import send


send('test@example.com','Hello')

总结

Python 定义私有函数的步骤如下:

  • 首先,创建一个包含 __init__.py 文件的包。
  • 其次,在模块的 __all__ 变量中排除该函数。
  • 最后,在 __init__.py 文件中导入模块中的对象,并且通过包的 __all__ 变量暴露公有函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

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

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

打赏作者

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

抵扣说明:

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

余额充值