分享

在 __init__.py 里写代码的若干理由

 dinghj 2019-04-26
2014年09月29日 18:23:38

在看库或框架的开源源代码时经常看到 __init__.py 里留下了若干代码。__init__.py 文件让python认为init所在的文件夹是一个包,这自不必详说。

当将一个包作为模块导入时,实际上导入了它的 __init__.py 文件。

当我们导入init包的时候,init脚本自动运行。

那么,为什么要在 __init__.py 文件里写代码,这样做有什么好处。

好处:在 __init__.py 里写一些程序内部用到的数据结构或为用户提供一个统一的接口。

例如:

以 django forms 模块为例,在django.forms 模块里定义了各种各样的函数和类,这些函数和类分类放在不同的文件中。

  1. forms/
  2. __init__.py
  3. extras/
  4. ...
  5. fields.py
  6. forms.py
  7. widgets.py
  8. ...

现在你要写一个新 form ,必须继承 Form 类,在 __init__.py 没发挥作用时的代码是这样的:
  1. class CommentForm(forms.forms.Form):
  2. name = forms.fields.CharField()
  3. url = forms.fields.URLField()
  4. comment = forms.fields.CharField(widget=forms.widgets.Textarea)

这样既不方便又很丑。而我们一般直接使用的是 django.forms 包下的 namespace。像这样:
  1. from django import forms
  2. class CommentForm(forms.Form):
  3. name = forms.CharField()
  4. url = forms.URLField()
  5. comment = forms.CharField(widget=forms.Textarea)
这就是在 forms/__init__.py 里写代码的好处(可以引入 widgets, forms, fields)
  1. from django.forms.fields import *
  2. from django.forms.forms import *
  3. from django.forms.formsets import *
  4. from django.forms.models import *
  5. from django.forms.widgets import *

例2:

有这样一个foo包

  1. foo/
  2. __init__.py
  3. foofactories.py
  4. tallFoos.py
  5. shortfoos.py
  6. mediumfoos.py
  7. santaslittlehelperfoo.py
  8. superawsomefoo.py
  9. anotherfoo.py
在init脚本里这样写:
  1. __all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos',
  2. 'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo']
  3. # deprecated to keep older scripts who import this from breaking
  4. from foo.foofactories import fooFactory
  5. from foo.tallfoos import tallFoo
  6. from foo.shortfoos import shortFoo
如此做,则可以在别的脚本里简单方便的写:
from foo import fooFactory, tallFoo, shortFoo
简化了代码量。

若 from foo import * ,则导入了init里的 __all__ 变量里注册的所有模块(不推荐)

Django 经常把一些共通的类或函数放在 init 里,例如 django.conf.urls 包中的init里定义了三个方法 include,patterns,url。这些方法我们再熟悉不过。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多