Python - __all__ 变量

简介: Python - __all__ 变量

import *


  • 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线 _ 或者双下划线 __ )开头的变量、函数和类
  • 因此,如果不想模块文件中的某个对象被引入到其它文件中使用,可以在其名称前添加下划线
  • 下面就来讲下 import * 的栗子

 

demo.py

def say():

   print("人生苦短,我学Python!")

def disPython():

   print("小菠萝教程:https://www.cnblogs.com/poloyy/")

 

test.py

from demo import *


say()

disPython()

 

执行结果

人生苦短,我学Python!

小菠萝教程:https://www.cnblogs.com/poloyy/

 

如果对象不想被引入呢

如果 demo.py 模块中的 disPython() 函数不想让其它文件引入,则只需将其名称改为 _disPython() 或者 __disPython()

再次执行 test.py,输出结果

人生苦短,我学Python!

Traceback (most recent call last):

 File "C:/Users/polo/Desktop/2.py", line 4, in <module>

   disPython()

NameError: name 'disPython'isnot defined

test.py 文件中无法使用未引入的 disPython() 函数

 

Python 模块 __all__ 变量


  • 模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些对象成员(变量、函数或者类)的名称(字符串格式)
  • 通过在模块文件中设置 __all__ 变量,当其它文件以 from 模块名 import * 的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的对象成员,未指定的成员是无法导入的

 

demo.py

def say():
    print("人生苦短,我学Python!")
def disPython():
    print("小菠萝教程:https://www.cnblogs.com/poloyy/") 
__all__ = ["say"]


__all__ 变量包含 say()的函数名,包含 disPython() 函数的名称

 

test.py

from demo import *


say()

disPython()

 

运行 test.py

人生苦短,我学Python!

Traceback (most recent call last):

 File "C:/Users/mengma/Desktop/2.py", line 4, in <module>

   disPython()

NameError: name 'disPython'isnot defined

  • 对于 test.py 来说,demo.py 模块中的 disPython() 函数是未引入,这样调用是非法的
  • 重点:__all__ 变量仅限于在其它文件中以 from 模块名 import * 的方式引入

 

使用以下 2 种方式引入模块,__all__ 变量是无效的


方式一

import 模块名 的形式导入模块,通过该方式导入模块后,总可以通过模块名前缀(如果为模块指定了别名,则可以使用模快的别名作为前缀)来调用模块内的所有成员(除了以下划线开头命名的成员)

 

demo.py

def say():
    print("人生苦短,我学Python!")
def disPython():
    print("小菠萝教程:https://www.cnblogs.com/poloyy/") 
__all__ = ["say"]


test.py

import demo


demo.say()

demo.disPython()

 

运行 test.py

人生苦短,我学Python!
小菠萝教程:https://www.cnblogs.com/poloyy/

虽然 demo.py 模块中设置有  __all__ 变量,但是当以 import demo 的方式引入后,__all__ 变量将不起作用

 

方式二

from 模块名 import 对象成员 的形式直接导入指定成员,使用此方式导入的模块,__all__ 变量即便设置,也不起作用

 

demo.py

仍然是上面的 demo 代码

 

test.py

from demo import say

from demo import disPython


say()

disPython()

 

运行 test.py

人生苦短,我学Python!

小菠萝教程:https://www.cnblogs.com/poloyy/

相关文章
|
4天前
|
Shell Python
python 和shell 变量互相传递
python 和shell 变量互相传递
24 0
|
4天前
|
Python
【Python操作基础】——变量操作
【Python操作基础】——变量操作
|
4天前
|
Python
在Python中,全局变量和局部变量是两种不同类型的变量
【5月更文挑战第10天】Python中的全局变量在函数外部定义,作用域覆盖整个程序,生命周期从开始到结束。局部变量仅限于函数内部,生命周期从调用到返回。在函数内修改全局变量需用`global`关键字声明,否则会创建局部变量。
21 3
|
4天前
|
存储 Java Python
python变量、常量、数据类型
python变量、常量、数据类型
|
1天前
|
存储 Java 程序员
【Python 的内存管理机制专栏】深入解析 Python 的内存管理机制:从变量到垃圾回收
【5月更文挑战第18天】Python内存管理关乎程序性能与稳定性,包括变量存储和垃圾回收。变量存储时,如`x = 10`,`x`指向内存中值的引用。垃圾回收通过引用计数自动回收无引用对象,防止内存泄漏。了解此机制可优化内存使用,避免循环引用等问题,提升程序效率和稳定性。深入学习内存管理对成为优秀Python程序员至关重要。
【Python 的内存管理机制专栏】深入解析 Python 的内存管理机制:从变量到垃圾回收
|
4天前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
18 6
|
4天前
|
Python
python 变量的定义和使用详解
python 变量的定义和使用详解
13 0
|
4天前
|
Java C# 开发者
Python 中的类型注解是一种用于描述变量、函数参数和返回值预期类型的机制
【5月更文挑战第8天】Python的类型注解提升代码可读性和可维护性,虽非强制,但利于静态类型检查(如Mypy)。包括:变量注解、函数参数和返回值注解,使用内置或`typing`模块的复杂类型,自定义类型注解,以及泛型模拟。类型注解可在变量声明、函数定义和注释中使用,帮助避免类型错误,提高开发效率。
23 6
|
4天前
|
Python
python变量未定义(NameError)
【5月更文挑战第1天】
19 1
|
4天前
|
Python
python函数的返回值、嵌套方式以及函数中的变量(二)
python函数的返回值、嵌套方式以及函数中的变量(二)
213 1