【问题标题】:How can I call a Subclass object from a Superclass and is there a better way to do this? (Python 3)如何从超类调用子类对象,有更好的方法吗? (Python 3)
【发布时间】:2016-07-31 00:43:03
【问题描述】:

我正在用 python(3) 创建一个游戏,我有一个主类,其中包含游戏循环和一堆变量。我有一个子类来创建“路径”对象,我需要主类中的变量。我还需要从主超类调用子类。每次调用子类的时候,也会调用主类的init方法来传递变量。问题是当这种情况发生时,它会重置主类中所有变量的值。

class Main:
    def __init__(self):
        foo = 0 
        sub1 = Sub()

    def foo_edit(self):
        self.foo += 5

    def main(self):
        sub2 = Sub()


class Sub(Main):
    def __init__(self):
        super(Sub, self).__init__()
        self.bar = 0

    def foo_edit(self):
        self.foo += 10

我查看了许多其他类似的问题,但没有一个给出我需要的答案。我在我的代码中尝试了 sub1(在 main 的 init 函数中),这会产生递归循环错误,因为 init 函数会永远互相调用。当我在游戏循环(或本例中的 main)中调用它时,它会在每次调用时重新初始化 Main,擦除 Sub 中所需的变量。之前我只有一个“路径”实例,所以我不需要类,并且有一个函数。现在我需要多个“路径”对象,我正在使用 main 的子类来获取我需要的变量。

对此问题的解决方案可以回答或不回答我的问题(从超类调用子类可能是一个坏主意),我们将不胜感激。提前致谢。

编辑:我可以将所需的变量传递给“Sub”类,但是我需要更新它们,所以我需要某种更新方法来确保传入的变量在 Sub 中在 Main 中时发生更改.这很容易实现,但我想知道是否有更简单/更好的方法。

【问题讨论】:

  • 继承Main的目的是什么?鉴于它的名称为Main,这意味着它是主程序,拥有两个“主”程序是没有意义的。
  • @BryanOakley 这不是两个主要程序,在我的游戏中我有一个制作路径的功能,现在我想制作 x 个路径,所以我制作了一个路径类,这样我就可以制作 x 个对象的路径类。它需要主类中的变量来进行计算,这就是它从主类继承的原因。
  • 你的例子很难理解,因为这两个类实际上都没有做任何事情。你说你需要sub,但你的班级对它没有任何作用。为什么你的类需要一个自身子类的实例?如果Main 的每个实例都需要Sub 的实例,而SubMain 的实例,那么您是说Sub 的每个实例都需要Sub 的实例,这甚至是递归的只是在概念上。如果Sub“需要来自主类的变量”,那并不意味着你需要SubMain继承;您可以让 Main 实例将自身传递给 Sub 方法。
  • 谈论代码气味...您不必将每个主要属性作为参数传递...也许可以尝试将Main 实例传递给您的Sub,而不是从@987654338 继承@ 在您的 Main 类中,您甚至可以拥有 sub1 = Sub(self)。然后,您可以在 Sub 的逻辑中使用该实例来创建路径。这是一个经典的继承案例,其中对象组合可能是最好的方法。

标签: python class python-3.x oop


【解决方案1】:

您误解了子类的目的。继承不是为了共享数据,而是为了制作通用类型的特殊情况。

如果Sub 应该与Main 完全相同,但有一些特化,那么您应该使用继承。当您说“Sub”是“Main”的子类时,您是在说“Sub 是 Main”,而不是“Sub 使用 Main 的一部分”。

如果Sub 只需要访问Main 中的数据,请使用组合。如果Sub 需要来自Main 的数据,则将Main 的实例传递给Sub,并让Sub 对该实例进行操作。

例如:

class Main():
    def __init__(self):
        self.foo = 42
        self.sub1 = Sub(self)
        self.sub1.foo_edit()
    ...

class Sub():
    def __init__(self, main):
        self.main = main

    def foo_edit(self):
        self.main.foo += 10

【讨论】:

  • 谢谢,这很有帮助。我是面向对象的新手,所以我不完全理解这个概念。我知道子类从父类继承方法和变量,并且根据我有限的知识,这似乎是将变量传递给另一个类的最佳方式。
  • 我对这个解决方案有一个疑问。如果在创建 Sub 对象后 Main 中的变量发生更改,它会在 Sub 类中更新吗? Main 的当前状态是否会反映在 Sub 类中?
  • @TheTesseract'sShadow:它不会在 Sub 类中更新,因为它在 Sub 类中不存在。它存在于 Main 类中,任何引用 Main 类的东西都引用了更改后的值。因此更改将在 Sub 类中可见,而不是在 Sub 类中in
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2016-01-22
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多