有很多帖子,我使用__init__.py
的情况,并用于定义全局变量是其中之一。
但我想知道在__init__.py
中定义局部变量是否有任何缺点?在__init__.py中定义任何变量
回答
使用全局变量有它的问题一般:
传递变量作为函数的参数如比具有访问全局变量的函数更加灵活和可读。
在连接对象网络的情况下,对于让对象引用其他对象,然后使用全局对象访问其他对象,通常会更灵活。
拥有模块导出类而不是实例允许您拥有一个类的多个实例,而不是一个。
说了这么多,这是我的经验,在编程中没有教条。算法设计中一个众所周知的引理是,从每个资源(程序中的东西)可能有零个,一个或无限多个。如果你通常只能有一个对象的实例,并且它不改变标识,那么从一个模块中导出一个实例(所以在模块__init__.py中定义它)就没有问题。
这只是在设计开始时,您有时会认为某个资源是独一无二的,但后来发现您会拥有多个资源。
导出变量而不是类型的典型应用是实际上是一个常量。一个很好的例子就是math.pi,它不会经常改变......
请注意,由于在Python中一切都是对象,所以在这里可以互换使用“变量”和“实例”。除此之外,函数和类在Python中都是(通常是单例)对象。
没有任何技术原因阻止使用__init__.py来声明全局变量。
不过,__init__.py模块的意思是定义应用程序的导入结构。从Python文档:
需要__init__.py文件才能使Python将目录视为包含包;这是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径中发生的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后介绍。
作为开发人员,我期望在__init__.py文件中找到应用程序本身的导入布局。这是我在探索源代码时寻找的最后一个地方。
因此,将隐藏在__init__.py中的实现是误导性的。全球变量尤其如此,其生命周期在定义上很难遵循。
这被认为是不好的做法,因为打破了Python的准则之一的代码可读性。
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
...
Readability counts.
...
- 1. 如何访问__init__.py中定义的(全局)变量?
- 2. 如何导入__init__.py中定义的变量?
- 3. __all__变量未拿起在__init__.py
- 4. 我可以使用__init__.py来定义全局变量吗?
- 5. 从__init__.py定义跨模块/全局变量
- 6. 如何在__init__.py中正确地扩展变量__all__?
- 7. 我如何能在__init__.py
- 8. 与__init__.py
- 9. python:未定义的变量:__init__错误
- 10. 如何从包的更深层部分访问__init__.py变量
- 11. 是否可以从views_py中的__init__.py导入变量?
- 12. __init__.py的用法
- 13. 包__init__.py中没有定义__all__的结果?
- 14. Python中包的API。在__init__.py中?
- 15. Python:在导入类后打印在__init__.py中声明的变量
- 16. 如何定义__init__
- 17. 在__init__.py中递归填充__all__
- 18. 在Python和__init__.py中导入模块
- 19. Django安装在django.core中没有__init__.py
- 20. 的__init__.py不蟒蛇
- 21. 简单迁移到__init__.py
- 22. 我删除__init__.py错误
- 23. __import__只能导入__init__.py
- 24. Tweepy错误:No __init__.py
- 25. __import __()调用__init__.py两次?
- 26. __init __()与__init__.py相比
- 27. 无法使用__init__.py
- 28. Python打包 - 这__init__.py的
- 29. 充分利用__init__.py
- 30. 如何在__init__中定义属性
你是指“在__init __。py中定义一个**局部变量**”是什么意思? –