【问题标题】:Basic Inheritance in Python?Python中的基本继承?
【发布时间】:2014-06-06 02:34:28
【问题描述】:

我正在尝试使用 Python 中的一个简单示例自学继承,但我似乎无法掌握基本知识。我正在尝试使用 MathOps 类中定义的 add 函数并在 Inherited 类中使用它。我错过了什么?

def main():
    result = Inherited(2,4)
    print result.add()

class MathOps:
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def add(self):
        sum = self.a + self.b
        return sum

    def multiply(self):
        product = self.a * self.b
        return product

class Inherited(MathOps):
    def __init__(self,a,b):
        self.add()
        return sum

if __name__ == '__main__':
    main()

【问题讨论】:

  • 你能解释一下你想做什么吗?您发布的代码显然是错误的,但是如果没有解释它应该做什么以及您为什么期望它这样做,很难说出它的方式和内容是错误的为什么本来是对的。
  • 嗨,我正在尝试打印 6 的结果,因为 Inheritance 类会将 2 加在一起,但我不确定如何在 Inherited 类中“声明”add 函数。

标签: python function class inheritance


【解决方案1】:

您的代码有两个问题,都在 Inherited.__init__ 方法中。

首先是您没有将self.add() 的结果分配给任何东西,因此您稍后尝试返回的sum 变量是未定义的。您需要使用sum = self.add() 或将代码简化为一条语句:return self.add()

第二个问题是Inherited.__init__ 没有任何意义。您正在返回一个值,该值将被忽略(__init__ 通常不应返回任何内容)。此外,您没有调用基类的 __init__ 方法,因此 self.aself.b 永远不会正确设置(这意味着 self.add() 实际上不会起作用)。

这是一个修改后的版本,它实际上在 Inherited.__init__ 方法中做了一些有意义的事情(如果不是非常有用的话):

class Inherited(MathOps):
    def __init__(self, a, b):
        super(Inherited, self).__init__(a, b)   # call base class __init__
        self.sum = self.add()   # assign return value from add to an attribute
        # don't return anything from __init__

现在,您可以像这样使用它:

val = Inherited(2, 4)
print val.sum   # prints the sum that was calculated in __init__

【讨论】:

  • 谢谢,为什么我用self.sum的时候不需要self呢?
  • @ShankarKumar:你指的是哪里?在MathOps.add 中,名称sum 属于一个局部变量(方法的局部变量),因此使用self 会稍微改变它的行为。在顶级代码中,我使用val.sum 来获取以前称为self.sum 的值。这两者的第一部分是Inherited 实例。 self 只是在实例自己的方法中使用的实例的名称。它是函数的第一个参数,你可以用不同的方式命名(尽管你不应该这样做,因为self 是一个成熟的约定)。
【解决方案2】:

你的问题在这里:

def __init__(self,a,b):
    self.add()
    return sum

不要从__init__返回,这意味着Inherited(...)的结果是一个整数而不是Inherited的一个实例。此外,如果您使用的是 2.7,请确保您使用的是新型类(即MathOps(object))。

【讨论】:

  • 我删除了return sum部分并添加了(object),但还是不行,是否需要在Inherited类中添加另一个方法?
  • 您还应该在子类的__init__ 中显式调用父类的__init__ 方法,在Python 2.x 中使用super(Inherited, self).__init__(a, b),在Python 3.x 中使用super().__init__(a, b)。确保在致电 self.add 之前完成此操作。
  • 第二个@dano。或者,完全删除继承类中的__init__
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多