__init__在python中的用法知乎_理解python中的__init__.py和__call__

__ init __.py

what is __init__.py?

通常在一个工程文件里面,我可能会发现在某个文件夹下面会有一个命名为__init__.py的py文件

why need __init__.py?

在一个工程文件下面,我们可能会有很多的py文件(模块),文件太多,管理很不方便,这时候我们就可以创建一个包(package)对这些文件进行管理,把具有共同特征的文件放在同一个package里面,那该如何创建package,很简单,其实就是新建一个文件夹,然后在里面新建一个__init__.py文件,这样子python就会把该文件夹当成一个package来看待了。package的引入是为了方便管理模块和在程序中导入模块。

how to use __init__.py?

首先要知道:1.当import package时候,package的__init__.py会同时被导入

2.采用精确导入package时候,__init__.py的模块,函数等会成为package的属性。

现在工程文件下有这样子的层次关系:

mypackage

model.py

util.py

main.py

model.py代码如下

class student():

pass

class teacher():

pass

util.py代码如下:

def play():

print("playing basketball")

def clean():

print("cleaning!")

__init__.py代码如下:

from .model import student,teacher

from .util import play

import numpy

main.py代码如下:

from mypackage import *

if __name__ == "__main__":

a = student()

print(numpy.array([1,2,4]))

这里使用模糊导入 from mypackage import *, 便可以把__init__.py的模块导入,使得main.py的代码更加整洁。当然模糊导入是不建议的,因为当你多几条import *时候,根本看得出哪个模块来自哪个package,而且如果模块名字相同的话,后面的会覆盖前面的,有bug很难de(《effective python》一书中有详细描述,文末见链接)

一般采用模块精确导入import x或者form x import y,main,py代码如下

import mypackage as mp

if __name__ == "__main__":

a = mp.student()

print(mp.numpy.array([1,2,4]))

可以看到,student类和numpy模块都需要在前面加上package的名字(student类和numpy模块成了mp的属性),使得模块导入更加清晰。

再来谈谈__all__

what is __all__?

__ all__是python的特殊属性,是python的因为前后都有双下划线"__"

why need __ all __?

在一个模块中有很多类,函数,别人可以通过from mypackage import * 进行模糊导入,但是package里面有些重要的类或者函数我不想被别人import,想隐藏起来,怎么办呢?这时候就要用到__all__这个特殊方法了。

how to use __ all __?

修改mypackage 里面的__init__.py模块,如下

from .model import student,teacher

from .util import play

import numpy

__all__ += ['numpy','teacher'] #添加该语句

当运行main.py的代码时候报错

File "c:\Users\92872\Desktop\a py\main.py", line 11, in

a = student()

NameError: name 'student' is not defined

当然如果你精准导入import mypackage, __all__时不起作用的。

如果不恰当,请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值