我有以下问题
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类调用它时会打印无
如何解决这个问题? 我做错了什么?
答案 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类构造函数中
查理