我越来越多地使用Python,并且我一直__all__在不同的__init__.py文件中看到变量集.有人可以解释这是做什么的吗?
Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示:__myPrivateMethod().那么,如何解释这一点呢
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?!
我会对那些没有那么做的人解释一下.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Run Code Online (Sandbox Code Playgroud)
我在那里做的是使用公共方法和私有方法创建一个类并实例化它.
接下来,我称之为公共方法.
>>> obj.myPublicMethod() …Run Code Online (Sandbox Code Playgroud) 在本周大师的这篇文章中,有人说:It is illegal to #define a reserved word.这是真的吗?我找不到常规,我已经看过程序员重新定义新的,例如.
考虑以下三个常规包及其内容的层次结构:
quick
??? brown
? ??? fox.py
? ??? __init__.py
??? lazy
? ??? dog.py
? ??? __init__.py
??? __init__.py
Run Code Online (Sandbox Code Playgroud)
现在假设jump模块中有一个函数,模块dog中需要它fox.我该怎么办?
最近看到Raymond Hettinger 在Pycon 2015上的 演讲我希望这个函数可以直接从包的根目录导入lazy,如下所示:
from lazy import jump
Run Code Online (Sandbox Code Playgroud)
此外,在我看来,编写相对导入更简洁,并使包内连接容易可见.因此,我将其写入lazy/__init__.py:
from .dog import jump
Run Code Online (Sandbox Code Playgroud)
这进入fox.py:
from ..lazy import jump
Run Code Online (Sandbox Code Playgroud)
但我想知道,这是正确的方法吗?
首先,导入名jump中lazy/__init__.py没有采取任何措施防止它直接被导入dog.如果某个功能可能从很多地方导入,会导致问题吗?例如,在单元测试中,我们是否可能从错误的位置修改名称?
此外,具有自动导入例程的IDE似乎更喜欢从定义函数的模块导入.我可以通过将字符_放在所有模块名称前面来覆盖它,但这似乎有点不切实际.
将包裹外所需的所有名称带到其他地方是否危险__init__.py?可能这至少增加了循环进口的可能性.但我想如果遇到循环导入,无论如何都会对包结构产生根本性的错误.
相对进口怎么样? PEP 8表示建议绝对进口:当它说绝对进口表现优于相对进口时,它意味着什么?能给我举个例子?