给定以下文件:
a.py
-----
class CommonClass(object):
def do_thing(self):
pass
b.py
-----
from a import CommonClass
class SubClassA(CommonClass):
def do_thing(self):
print("I am A")
class SubClassB(CommonClass):
def do_thing(self):
print("I am B")
c.py
-----
from a import CommonClass
from b import SubClassA
if __name__ == "__main__":
for member in CommonClass.__subclasses__():
member().do_thing()
我希望只有SubClassA
导入的,并且在通过的子类循环时才可见CommonClass
,但是似乎SubClassB
也导入了。
我正在运行Python 3.8.5,这是输出python3 c.py
:
$ python3 c.py
I am A
I am B
如何只导入想要的类?
您确实只导入SubClassA
了c.py
。这可以通过做测试
x = SubClassB()
要么
x = b.SubClassB()
两者都会导致NameError
。
问题是,当您import
使用文件时from x import y
,即使使用!,它实际上也已在运行。
通过print("I'm from b.py")
在末尾添加ab.py
然后运行,可以很容易看出这一点c.py
。
这将使SubClassA
和SubClassB
成为CommonClass
您导入的的子类。因此,虽然您无权访问SubClassB
name,但它仍然是name的子类,CommonClass
您可以从那里访问它。
通常,您不必导入模块即可使用其对象。导入将扩展名称空间以包括该模块,因此您可以直接创建对象。如果以其他方式获取了该模块的对象,即使不导入也可以使用它(例如,导入第三个模块,该模块从第二个模块返回对象)。
无论如何,您甚至都没有真正使用import SubClassA
。如果要“允许”仅从外部来源考虑的某些类,则可以创建允许的类集:
from a import CommonClass
from b import SubClassA
allowed_classes = {SubClassA}
if __name__ == "__main__":
for member in CommonClass.__subclasses__():
if member in allowed_classes:
member().do_thing()
仅打印 I am A
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句