1. __ init __.py文件的作用
(1) 定义包
区分一个含有Python脚本的文件夹 和 python包(可以执行import package
操作的文件夹)的标志就是看,这个文件夹下有没有__ini__.py文件,当一个文件夹下有这个文件,你可以进行导入相关操作,但是如果这个文件夹没有这个文件,那么python解释器是没有办法去执行import
操作的,解释器看待你创建这个“包”就是一个文件夹。
那么怎么把文件夹当做包来导入呢?
…文件夹下创建一个__init__.py 文件啊! ╮(╯▽╰)╭
(2) 预导入
包下的__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。
包的属性方法,什么意思呢?我们拿flask-login这个包来举例。
- 以下是flask-login包的__init__.py文件的全部内容,我们可以看到这个文件做了什么事情呢?有包的介绍,开发时间,更新版本,以及license等信息。
- 除此还有预先导入的包下的其他的模块,因为在init文件中预先导入了这些模块,你在安装了flask-login包之后,才能使用如
from flask-login import login_manager
这样的语句,亦或是import flask-login
,然后在代码中使用flask-login.login_manager
去调用相关模块。 - 如果__ini__.py为空,你用
import flask-login
啥都做不了,如果这时候再用包.模块名
的方式调用,就会报AttributeError: 'module' object has no attribute 'Module1'
. (^_−)☆
# -*- coding: utf-8 -*-
'''
flask_login
-----------
This module provides user session management for Flask. It lets you log
your users in and out in a database-independent manner.
:copyright: (c) 2011 by Matthew Frazier.
:license: MIT/X11, see LICENSE for more details.
'''
from .__about__ import __version__
from .config import (COOKIE_NAME, COOKIE_DURATION, COOKIE_SECURE,
COOKIE_HTTPONLY, LOGIN_MESSAGE, LOGIN_MESSAGE_CATEGORY,
REFRESH_MESSAGE, REFRESH_MESSAGE_CATEGORY, ID_ATTRIBUTE,
AUTH_HEADER_NAME)
from .login_manager import LoginManager
from .mixins import UserMixin, AnonymousUserMixin
from .signals import (user_logged_in, user_logged_out, user_loaded_from_cookie,
user_loaded_from_header, user_loaded_from_request,
user_login_confirmed, user_unauthorized,
user_needs_refresh, user_accessed, session_protected)
from .test_client import FlaskLoginClient
from .utils import (current_user, login_url, login_fresh, login_user,
logout_user, confirm_login, login_required,
fresh_login_required, set_login_view, encode_cookie,
decode_cookie, make_next_param)
__all__ = [
LoginManager.__name__,
FlaskLoginClient.__name__,
UserMixin.__name__,
AnonymousUserMixin.__name__,
__version__,
'COOKIE_NAME',
'COOKIE_DURATION',
'COOKIE_SECURE',
'COOKIE_HTTPONLY',
'LOGIN_MESSAGE',
'LOGIN_MESSAGE_CATEGORY',
'REFRESH_MESSAGE',
'REFRESH_MESSAGE_CATEGORY',
'ID_ATTRIBUTE',
'AUTH_HEADER_NAME',
'user_logged_in',
'user_logged_out',
'user_loaded_from_cookie',
'user_loaded_from_header',
'user_loaded_from_request',
'user_login_confirmed',
'user_unauthorized',
'user_needs_refresh',
'user_accessed',
'session_protected',
'current_user',
'login_url',
'login_fresh',
'login_user',
'logout_user',
'confirm_login',
'login_required',
'fresh_login_required',
'set_login_view',
'encode_cookie',
'decode_cookie',
'make_next_param',
]
- 是不是奇怪这个__all__列表是干嘛的,为嘛没解释,没写漏。( ̄へ ̄) 你在写代码的时候有没有用过
fom flask-login import *
这种懒人写法?现在懂了吗,这个imprt *
全部导入的就是这个__all__列表中的内容~~~
列表__all__,可以控制*所表示要引入的东西(模块,函数,类等)
(3) 配置模块的初始化操作
其实__init__.py 文件和其他py文件一样,是可以写代码的,除了预定义和预导入等初始化操作,如果包还有其他初始化操作,你可以吧代码写在这里,python解释器在加载包的时候,会首先执行__init__.py文件,比如你写的爬虫包的预加载、预定义的等代码。