2016-04-24 61 views
3

我正在努力处理多个文件中的继承类的定义。跨文件的类继承

我搜索了很长时间,并找到了一些例子,但没有解决我的问题。

让我们深入到一个例子:

file1.py:

from file2 import SubClass 

class MainClass: 
    def __init__(self): 
    print("This is MainClass") 

mc = MainClass() 
mc.SaySomething() 

file2.py:

from file1 import MainClass 

class SubClass(MainClass): 
    def SaySomething(self): 
    print("This is the subclass") 

我的目标是一个巨大的类分成多个文件,每个文件包含一些相关的功能。

我试了很多不同的组合,但总是得到一个错误 - 当我改变一些当然,但结果是相同的,这是不同的;它不起作用。

我想这与我试图将每个文件导入对方的方式有关,但我还没有想出如何去做,所以我希望有人能解决它,并向我解释。

实际上第三个文件是将导入主类并执行它。我猜这个文件只需要导入file1.py,因为它会导入file2 - 否则请纠正我。

好的,这是第一部分。但是,我也很好奇,如果我可以在对象中创建一些多个嵌套的模块/函数 - 对于结构的缘故。

我很确定一个例子会更好地解释它。我可以制造类似于:

mc = MainClass() 
mc.SubClass.SaySomething() 

...而不是仅仅是mc.SaySomething()?我想,这样我可以保持更好的代码结构。

+0

这被称为循环导入。在file1中,您导入了smth。从file2开始,反之亦然。这几乎总是表明你应该改变你的设计。 – schwobaseggl

+3

'从file2导入SubClass'不需要,你没有使用'SubClass' –

+0

我不确定file1.py应​​该知道如何定义一个子类? –

回答

-1

我明白你想要做什么,你不应该这样做。

也许你想要做的多重继承,我希望你用下面的例子理解:

class A: 
    def __init__(self, number): 
     self.number = number 

    def increase(self): 
     self.number += 1 

class B: 
    def __init__(self, number): 
     self.number = number 

    def decrease(self): 
     self.number -= 1 

class AB(A, B): 
    def __init__(self, number): 
     self.number = number 

ab = AB(10) 
ab.increase() 
print ab.number 

通过这种方式,您可以在diferent文件分割你的类,然后做一个MainClass,但我不”我认为这将是最好的方式。

+0

请注意,循环导入在Python中是可能的。 – mwm314

0

你可以重构你的代码,使多个类最小化依赖(作为他们可以得到的独立)。然后,而不是继承尝试组成。这意味着使用鸭子打字而不是亲子关系。继承路线将不起作用,因为这意味着奇怪的循环导入。所以,

# a.py 
class A: 
    # some code 
# b.py 
import a 
class B: 
    aobj = a.A() 
    # go on using aobj 

但是,相反的这一切,你应该总是喜欢重新审视你的设计,清洗起来,使之成为更具可读性。此外,也可能发生这样的情况,即如果部分代码在经过一些检查后发现不相关,那么看起来很大的类可能会被干净地分割成多个块。