python class 调用super的方法而不是继承
python class call super's method instead of inherited
我有以下问题
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()
我发现,当我在 class C 中调用 super().drawRect()
函数时
它将 <__main__.C object at 0x0000023D99FA6748>
作为自己发送。
如何使 class C 在函数 draw() 中发送 <__main__.B object at 0x0000017A2BA95358>
在 super().drawRect()
我问是因为在非简化代码中,当我从 B class 本身调用函数时,它会打印 self.window,但是当从 C class 调用时它打印 None
如何解决这个问题?
我做错了什么?
创建C
的实例时没有B
对象,只有C
实例恰好继承自B
.
所以你的问题的答案是:
How can I make class C, in function draw()
send <__main__.B object at 0x0000017A2BA95358>
in the super().drawRect()
是:不能。
您可以在 C
对象旁边创建一个新的 B
对象(但这会违背继承的目的)。
但是在C.__init__
中调用super().__init__
似乎更合理:
class C(B):
def __init__(self):
super().__init__()
self.draw()
def draw(self):
super().drawRect()
无论如何不这样做会很奇怪。因为继承有点意味着您 扩展 而不是 完全覆盖 。
但是鉴于您在 B.createObject
方法中执行 self.c = C()
并且 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
继承似乎对您的 class C
来说是个坏主意,因为它完全覆盖了 B
的行为并且不使用任何它是属性(无论如何它都不能,因为你覆盖了方法)。
你需要打电话给
super().__init__()
在 class C 构造函数中
查理
我有以下问题
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()
我发现,当我在 class C 中调用 super().drawRect()
函数时
它将 <__main__.C object at 0x0000023D99FA6748>
作为自己发送。
如何使 class C 在函数 draw() 中发送 <__main__.B object at 0x0000017A2BA95358>
在 super().drawRect()
我问是因为在非简化代码中,当我从 B class 本身调用函数时,它会打印 self.window,但是当从 C class 调用时它打印 None
如何解决这个问题? 我做错了什么?
创建C
的实例时没有B
对象,只有C
实例恰好继承自B
.
所以你的问题的答案是:
How can I make class C, in function
draw()
send<__main__.B object at 0x0000017A2BA95358>
in thesuper().drawRect()
是:不能。
您可以在 C
对象旁边创建一个新的 B
对象(但这会违背继承的目的)。
但是在C.__init__
中调用super().__init__
似乎更合理:
class C(B):
def __init__(self):
super().__init__()
self.draw()
def draw(self):
super().drawRect()
无论如何不这样做会很奇怪。因为继承有点意味着您 扩展 而不是 完全覆盖 。
但是鉴于您在 B.createObject
方法中执行 self.c = C()
并且 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
继承似乎对您的 class C
来说是个坏主意,因为它完全覆盖了 B
的行为并且不使用任何它是属性(无论如何它都不能,因为你覆盖了方法)。
你需要打电话给
super().__init__()
在 class C 构造函数中
查理