全球遗产进口?

2024-04-20 00:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

设想一个名为base的模块中有一个名为Base的类。 现在在另一个名为sub的模块中,从Base继承一个类Sub

import base
class Sub(base.Base):
    pass

现在,如果我们添加第三个类,它继承自Sub,并接受一个必须是Base类型或其子类之一的参数:

import sub
class Deep(sub.Sub):
    def __init__(self, parent):
        if isinstance(parent, sub.base.Base):
            pass

在继承树中越深入,Base的路径将变成thedeepest.deeperanddeeper.reallydeep.deep.sub.base.Base,这是没有人愿意看到的。你知道吗

我当然可以只做from base import *from sub import *,然后只使用Base,但是有没有一种方法可以导入,这样我就可以只使用类的原始模块的前缀?你知道吗

例如:

import deep
class ReallyDeep(deep.Deep):
    def __init__(self, parent):
        # I know my polymorphism, this is just an example.
        if isinstance(parent, sub.Sub):
            pass
        elif isinstance(parent, base.Base):
            pass

Tags: 模块importselfbaseifinitdefpass
1条回答
网友
1楼 · 发布于 2024-04-20 00:24:29

Python中的模块类似于单例,它们只被导入一次,所以

import base
import deep
class ReallyDeep(deep.Deep):
    def __init__(self, parent):
       if isinstance(parent, base.Base):
           pass

完全没有问题,事实上,这是最好的方法。你知道吗

delnan的意思是,在大多数情况下,深度嵌套的继承树是糟糕设计的标志。任何规则都有例外。但一般来说,避免深度嵌套的树会使代码更易于理解,更易于测试,因此更易于维护。你知道吗

相关问题 更多 >