想象一个名为base
的模块,其中包含一个名为Base
的类。
现在位于另一个名为sub
的模块中,从Sub
继承一个类Base
:
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
答案 0 :(得分:1)
Python中的模块就像单例,它们只导入一次,所以
import base
import deep
class ReallyDeep(deep.Deep):
def __init__(self, parent):
if isinstance(parent, base.Base):
pass
完全没有问题,事实上,这是最好的方法。
delnan的意思是,在大多数情况下,深层嵌套的继承树是糟糕设计的标志。与任何规则一样,也有例外。但一般来说,避免深度嵌套的树会使您的代码更容易理解,更容易测试,因此更容易维护。