python类调用super的方法而不是继承

时间:2017-09-08 15:07:52

标签: python class inheritance super self

我有以下问题

class A:
    def __init__(self):
        self.window = "<I am window class>"

class B(A):
    def __init__(self):
        super().__init__()

    def createObject(self):
        print(self.window)  # it works here
        self.c = C()

    def drawRect(self):
        print(self.window)  # does not work when called from class C

class C(B):
    def __init__(self):
        self.draw()

    def draw(self):
        super().drawRect()

app = B()
app.createObject()

当我在C类中调用super().drawRect()函数时,我已经想到了这一点 它将<__main__.C object at 0x0000023D99FA6748>作为自我发送。

如何在函数draw()中发送<__main__.B object at 0x0000017A2BA95358>

中的super().drawRect()来创建C类

我在问,因为在非简化代码中,当我从B类本身调用函数时,它会打印self.window,但是当从C类调用它时会打印无

如何解决这个问题? 我做错了什么?

2 个答案:

答案 0 :(得分:1)

创建B的实例时没有C对象,只有C实例恰好从B继承。

所以问题的答案是:

  

如何在功能draw()中发送<__main__.B object at 0x0000017A2BA95358>

中的super().drawRect()来制作C类

是:你做不到。

您可以在B对象旁边创建一个新的C对象(但这会违反继承的目的)。

但是,您应该在super().__init__中致电C.__init__似乎更合理:

class C(B):
    def __init__(self):
        super().__init__()
        self.draw()

    def draw(self):
        super().drawRect()

无论如何不这样做会很奇怪。因为继承类型意味着您扩展而不是完全覆盖

但考虑到你在self.c = C()方法中B.createObject和从C继承的B,你应该找到另一种方式(例如composition )而不是继承:

class A:
    def __init__(self):
        self.window = "<I am window class>"

class B(A):
    def __init__(self):
        super().__init__()

    def createObject(self):
        print(self.window)  # it works here
        self.c = C(self)

    def drawRect(self):
        print(self.window)  # does not work when called from class C

class C(object):   # don't inherit from B
    def __init__(self, obj):
        self.obj = obj
        self.draw()

    def draw(self):
        self.obj.drawRect()

app = B()
app.createObject()

但是,这将创建一个引用周期,因为您将C实例存储为B实例的属性,并将B实例存储为C实例的属性。你也可能过多地简化了代码,也许真正的代码会以某种方式阻止编写。但是考虑到当前代码,似乎继承B对于您的类C来说是一个坏主意,因为它完全覆盖B的行为并且不使用它的任何属性(它无论如何都不能因为你覆盖了这些方法。)

答案 1 :(得分:0)

您需要致电

super().__init__() 
在C类构造函数中

查理