0

想象一个模块被调用,其中调用base了一个类Base。现在在另一个名为 的模块中,sub继承了一个类SubBase

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
4

1 回答 1

1

Python 中的模块就像单例,它们只被导入一次,所以

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

绝对没有问题,事实上,这是最好的方法。

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

于 2013-05-25T15:18:56.570 回答