【问题标题】:Object of a parentclass inside of a childclass Python子类Python中的父类对象
【发布时间】:2020-02-04 15:02:15
【问题描述】:

我有这个派生自 pygame.Rect 的 Button 类:

class Button(pg.Rect):

    def __init__(self, left, top, width, height, char):
        super().__init__(left, top, width, height)
        self.char = char

    def draw_rect(window):
        pg.draw.rect(window, pg.Color("red"), "rectobject")

pg.draw.rect 将 Rect 对象作为第三个参数。所以我想知道 super() 方法是否实例化了父类的对象,如果是的话,如何引用它(因为我们使用 self 作为类)。 我知道这是一个微不足道的问题,但我对这些东西在 Python 中的工作方式很感兴趣。提前致谢!

【问题讨论】:

  • 这里只有一个对象,它是父类和子类的实例。 super().__init__() 调用执行对象成为功能性Rect 所需的初始化(不是实例化),__init__() 的其余部分执行对象成为功能性Button 所需的初始化。
  • @jasonharper 解释一下,非常感谢。

标签: python oop object inheritance


【解决方案1】:

您继承了 pg.rect,并且像 pg.rect 对象一样初始化了您的对象。因此,您的 Button 对象具有 pg.rect 对象中的所有属性。如果可以使用 pg.rect 对象,则可以使用 Button 对象。 (还需要在draw_rect方法中添加self参数)

import pygame as pg

display = pg.display.set_mode((100,100))

class Button(pg.Rect):

    def __init__(self, left, top, width, height, char):
        super().__init__(left, top, width, height)
        self.char = char

    def draw_rect(self, window):
        pg.draw.rect(window, pg.Color("red"), self)


b = Button(10,10,10,10,"a")

b.draw_rect(display)

pg.display.update()

调用super().__init__ 不会实例化任何东西,它会初始化您的self 参数。因此,您的 self 对象将具有来自 super().__init__bottomleft 等属性。

【讨论】:

  • 不确定使用 'self' 是否正确,因为 'char'。现在很清楚了,是的,我错过了自我论证。非常感谢
  • 没问题,pg.draw.rect 不关心char 属性。
  • 很抱歉,还有一个问题。所以这是一般规则,在这种情况下冗余参数会被忽略?
  • 想象一下你写了一个类。这个类有一个方法。例如,如果您尝试在此方法中访问self.char,则肯定您必须为其分配了一个值。所以是的,没有理由不忽略自定义属性。因为它不需要访问该属性,也不需要更改它。
  • 作为初学者,我必须说这种解释非常有帮助。似乎我得到了我想要的所有答案。再次感谢您。
【解决方案2】:

在子类中调用 super() 会隐式调用父类的构造函数,从而使子对象具有父类的所有属性,您可以使用 child.parentVar 简单地访问它们

python 2.x 和 3.x 的语法有区别

这里讨论了调用父级父级的语法及其语义: https://stackoverflow.com/a/33191175/12507046

【讨论】:

  • 我现在进入,我使用 python3,但会查看这些差异。非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多