Python中

时间:2018-05-26 16:15:51

标签: python

当我们使用from <module/package> import *时,除非模块的/ package的_列表明确包含它们,否则不会导入以__all__开头的任何名称。

这不适用于类的变量和函数吗?

从下面的程序中,它似乎不适用于类中的变量和函数。

_bar_check_func都在test_import.py中执行。但是,_test_func()会因为使用前导下划线而引发错误。我在这里错过了什么吗?

test_var.py

class test:
    def __init__(self):
        self._bar=15
    def test_mod(self):
        print("this is test mod function")
    def _check_func(self):
        print("this is _check_func function")

def _test_func():
    print("this is test function var 2")

test_import.py

from test_var import *

p1=test()
print(p1._bar)
p1.test_mod()
p1._check_func()

_test_func()

输出:

15
this is test mod function
this is _check_func function
Traceback (most recent call last):
  File "test_import.py", line 8, in <module>
    _test_func()
NameError: name '_test_func' is not defined

2 个答案:

答案 0 :(得分:0)

下划线规则是由导入者看到from test_var import *时强加的。实际上,这些函数仍然在模块命名空间中,您仍然可以使用它们:

import test_var
test_var._test_func()

您不会导入类方法,只能导入类,因此不应用下划线规则。 p1._check_func()的工作原理与test_var._test_func()的工作原理相同:您在其命名空间中处理了变量。

答案 1 :(得分:0)

您导入test并通过该命名空间(在您的示例中,通过实例化的对象p1)访问其成员(带或不带下划线)。 testimporttest._bar只能通过test访问,而不是import ed符号。