相关疑难解决方法(0)

有人可以在Python中解释__all__吗?

我越来越多地使用Python,并且我一直__all__在不同的__init__.py文件中看到变量集.有人可以解释这是做什么的吗?

python syntax namespaces

873
推荐指数
10
解决办法
26万
查看次数

为什么Python的"私有"方法实际上不是私有的?

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)

python encapsulation information-hiding python-2.7

632
推荐指数
11
解决办法
41万
查看次数

重新定义C++关键字是否合法?

在本周大师的这篇文章中,有人说:It is illegal to #define a reserved word.这是真的吗?我找不到常规,我已经看过程序员重新定义新的,例如.

c++ standards keyword c-preprocessor

12
推荐指数
2
解决办法
4635
查看次数

复杂包结构中的Python import语句?

考虑以下三个常规包及其内容的层次结构:

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)

但我想知道,这是正确的方法吗?

首先,导入名jumplazy/__init__.py没有采取任何措施防止它直接被导入dog.如果某个功能可能从很多地方导入,会导致问题吗?例如,在单元测试中,我们是否可能从错误的位置修改名称?

此外,具有自动导入例程的IDE似乎更喜欢从定义函数的模块导入.我可以通过将字符_放在所有模块名称前面来覆盖它,但这似乎有点不切实际.

将包裹外所需的所有名称带到其他地方是否危险__init__.py?可能这至少增加了循环进口的可能性.但我想如果遇到循环导入,无论如何都会对包结构产生根本性的错误.

相对进口怎么样? PEP 8表示建议绝对进口:当它说绝对进口表现优于相对进口时,它意味着什么?能给我举个例子?

python import

7
推荐指数
1
解决办法
573
查看次数