Python,从class_A调用class_B并从class_A继承方法

时间:2017-06-11 12:43:11

标签: python class inheritance

我在4个不同的文件中有main.py,parentClass,class_A和class_B。

从main.py

我调用class_A(parentClass的子类)和class_A我需要调用class_B,其中我想要class_A和parentClass的所有方法。我该怎么办?

class parentClass(object):
    def __init__(self):
       ......

class class_A(parentClass):
   def __init__(self):
       super().__init__()

   def method1(self):
       ....

   def method2(self):
       ....

   def call_class_B(self)
       x = class_B()


class class_B(?):
   def __init__(self):
       ...
   here I need to call the method of the other classes

基本上class_B是class_A的子类,但是从class_A

调用它

1 个答案:

答案 0 :(得分:0)

问题

我相信,根据您问题的第一行,这里的主要问题是避免circular import。如果这些类中的每一个都在一个单独的文件中,那么很难确保在何时以及如何需要时定义正确的父类。

解决方案

对此的一个解决方案是将整个内容设置为包含以下文件的模块(在名为my_module的目录中):

__ INIT __ PY:

from .parent import Parent

class ClassB(object):
    pass

from .a import ClassA
from .b import ClassB

parent.py

class Parent(object):
    def meth(self):
        print("From Parent")

a.py

import my_module

class ClassA(my_module.Parent):
    def get_a_B(self):
        return my_module.ClassB()

    def meth(self):
        super().meth()
        print("From ClassA")

b.py

import my_module

class ClassB(my_module.ClassA):

    def meth(self):
        super().meth()
        print("From ClassB")

然后,在my_module之外,您可以使用以下main.py:

from my_module.b import ClassB

if __name__ == "__main__":
    myB = ClassB()
    my_other_B = myB.get_a_B()
    my_other_B.meth()

运行时(Python 3.5)将打印以下输出:

From Parent
From ClassA
From ClassB

发生了什么事?

在模块的__init__文件中,我们声明了ClassB的“虚拟”版本。我们使用它在a.py中定义ClassA但在实际使用 ClassA之前,它已被b.py中定义的 real ClassB取代,从而为我们提供所需的行为。

更好的解决方案

但是,所有这些确实都有一点code smell。如果ClassA和ClassB真的如此紧密地联系在一起,那么它们应该是一个单独的类。至少,它们应该在同一个文件中定义,正如zwer所指出的那样,它可以正常工作。

或者,你可能会考虑包装Parent类和ClassA的一些功能而不是继承,但是我们可能需要更多关于你正在做什么来说出最佳解决方案的信息。