“从模块导入类”从同一模块导入其他类

马库斯M.

给定以下文件:

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

如何只导入想要的类?

富美男

确实只导入SubClassAc.py这可以通过做测试

x = SubClassB()

要么

x = b.SubClassB()

两者都会导致NameError

问题是,当您import使用文件from x import y即使使用,它实际上也已在运行

通过print("I'm from b.py")在末尾添加ab.py然后运行,可以很容易看出这一点c.py

这将使SubClassASubClassB成为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章