__all__=[]的作用

来源:互联网 发布:崩坏3rd矩阵 编辑:程序博客网 时间:2024/06/06 21:45

看个小栗子:

#accounts/models.pyclass Card(TimeStampedModel):    user_id = models.IntegerField(unique=True, verbose_name=_(u"用户ID"))    number = models.CharField(max_length=20, verbose_name=_(u'卡号'))    name = models.CharField(max_length=16, verbose_name=_(u'开户人'))    class Meta:        verbose_name = _(u"银行账号")        verbose_name_plural = _(u"银行账号")class Kard(TimeStampedModel):    user_id = models.IntegerField(unique=True, verbose_name=_(u"用户ID"))    number = models.CharField(max_length=20, verbose_name=_(u'卡号'))    name = models.CharField(max_length=16, verbose_name=_(u'开户人'))    class Meta:        verbose_name = _(u"银行账号")        verbose_name_plural = _(u"银行账号")__all__ = ["Card"]

models.py的最后有一个__all__ = ["Card"]的属性,我们进入shell,看下

from all.accounts.models import *d = Kard()---------------------------------------------------------------------------NameError                                 Traceback (most recent call last)<ipython-input-2-145023eecf0b> in <module>()----> 1 d = Kard()NameError: name 'Kard' is not definedb = Card()

现象很明显了,导入models文件之后,使用Card类,无问题,使用Kard类的时候,会报错没有定义,在吧__all__ = ["Card"]这行注释掉,重新shell一下,这时就可以使用Kard类了,所以可以得到结论,__all__ = []是控制本py文件哪些可以被外部导出(使用)的类或方法。

在模块(*.py)中使用__all__,表示可以导出列表里的类、函数、变量等成员,
不使用(默认)将导出模型中所有不以下划线开头(私有)的成员,
在模块中使用__all__属性可避免在相互引用时的命名冲突

0 0
原创粉丝点击