当我们使用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
答案 0 :(得分:0)
下划线规则是由导入者看到from test_var import *
时强加的。实际上,这些函数仍然在模块命名空间中,您仍然可以使用它们:
import test_var
test_var._test_func()
您不会导入类方法,只能导入类,因此不应用下划线规则。 p1._check_func()
的工作原理与test_var._test_func()
的工作原理相同:您在其命名空间中处理了变量。
答案 1 :(得分:0)
您导入test
并通过该命名空间(在您的示例中,通过实例化的对象p1
)访问其成员(带或不带下划线)。 test
是import
,test._bar
只能通过test
访问,而不是import
ed符号。