Fork me on GitHub

Python系列文章-Python中语法知识积存

目录

  • 背景
  • 第一部分 Python中的__all__
  • 第二部分
  • 第三部分
  • 第四部分
  • 第五部分
  • 参考文献及资料

背景

第一部分 Python中的__all__

1.1 介绍

Python语言没有Java语言中有publicprivate关键字控制可见性,所以可见性需要制定统一的约定。例如__all__属性,我们先举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# module1.py 模块

__all__ = [
'A',
'fun1',
]

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

class B():
def __init__(self,name,id):
self.name=name
self.id=id

def fun1():
print 'fun1() is called!'
def fun2():
print 'fun2() is called!'

这时候我们使用代码转载module1的时候:

1
2
3
4
from module1 import *

A() # 没有问题
fun2() # 报错函数未定义,NameError: name 'fun2' is not defined

所以当我们使用 from module1 import *来导入时,此时被导入模块若定义了__all__属性,则只有__all__内指定的属性、方法、类可被导入。若没定义,则导入模块内的所有公有属性,方法和类 。即这个变量是个控制白名单。

当然对于非模糊导入,即精确指定导入是不影响的。例如上面的案例,可以使用下面的语句:

1
from module1 import fun2

1.2 总结

  • Python不提倡用 from xxx import * 这种写法,应该按需导入。

  • 以上是针对模块的导入,对于package的导入需要使用__init__.py文件。__init__.py为空时,通过from package import *无法导入任何name。

  • __all__ 的形式都是 list类型。

  • 按照PEP8建议的风格,__all__ 应该写在所有 import 语句下面,函数、常量等成员定义的上面。

  • 约定__all__可以这样定义:

    1
    2
    3
    4
    5
    __all__ = [
    'A',
    'fun1',
    ]
    # 最后多出的逗号在 Python 中是允许的,符合 PEP8 风格

第二部分 Python__init__.py文件

__init__.py该文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数

__init__.py 在包被导入时会被执行

参考文章

本文标题:Python系列文章-Python中语法知识积存

文章作者:rong xiang

发布时间:2022年03月14日 - 10:03

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/61256d55/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%