4
def __hello_world(*args, **kwargs):
  .....

我试过了

from myfile import __helloworld

我可以导入非私有的。

如何导入私有方法?

谢谢。


我现在使用单个下划线。

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    from myfile.ext import _hello_world
ImportError: cannot import name _hello_world

在我的 test.py

sys.path.insert(0, os.path.abspath(
                    os.path.join(
                        os.path.dirname(__file__), os.path.pardir)))

from myfile.ext import _hello_world
4

4 回答 4

8
$ cat foo.py
def __bar():
    pass

$ cat bar.py
from foo import __bar

print repr(__bar)

$ python bar.py
<function __bar at 0x14cf6e0>

也许你打错字了?

但是,通常双下划线方法并不是真正需要的——通常“公共”API 是零下划线,而“私有”API 是单下划线。

于 2012-04-30T03:43:22.777 回答
2

你确定你有最新的源导入?仔细检查您是否正在导入最新的源。

通过这样做检查它:

>> import myfile.ext
>> print dir(myfile.ext)

你应该看到所有的方法(我认为双下划线会被跳过,但仍然会出现单下划线)。如果没有,这意味着你有一个旧版本。

如果这显示正常,但您仍然无法导入实际的东西。制作一个virtualenv,然后重试。

于 2012-04-30T04:06:01.710 回答
1
from "module" import *

只导入“公共”字段和函数。对于私有字段和函数,您需要如其他答案中所述显式导入它们。请参阅下面的完整示例。在 python 3.7.4 上测试

$猫文件_w_privates.py

field1=101
_field2=202
__field3=303
__field4__=404

def my_print():                                                                                
  print("inside my_print")                                                                                                                                                                
def __private_print():
  print("inside __private_print")                                                                                             
def __private_print__():                                                                       
  print("inside __private_print__")

$ 猫文件导入.py

from file_w_privates import _field2, __field3, __field4__ # import private fields
from file_w_privates import  __private_print, __private_print__ # import private functions
from file_w_privates import *   # import public fields and functions

print(f"field1: {field1}")
print(f"_field2: {_field2}")
print(f"__field3: {__field3}")
print(f"__field4__: {__field4__}")

my_print()
__private_print()
__private_print__()
于 2019-10-01T00:50:42.207 回答
0

没有什么可以阻止您导入使用__. Python 在类的“私有”方法上实现名称修改以避免派生类中的事故,但它不应影响模块级别的定义。我的测试对此没有任何问题:

文件 A


def __test(): pass

文件 B


from A import __test

print __test  # output is <function __test at 0x024221F0>

我说“私人”是因为有兴趣这样做的人仍然可以导入这些方法。

于 2012-04-30T03:49:20.790 回答