【问题标题】:How do I call on a parent class in a subclass?如何在子类中调用父类?
【发布时间】:2016-08-23 12:54:37
【问题描述】:

我需要创建一个对 Plant 的 UNBOUND 方法调用来设置名称和叶子,但我不知道如何操作。任何帮助表示赞赏。

我的代码:

class Plant(object):
    def __init__(self, name : str, leaves : int):
        self.plant_name = name
        self.leaves = leaves
    def __str__(self):
        return "{} {}".format(self.plant_name, self.leaves)
    def __eq__(self, plant1):
        if self.leaves == plant1.leaves:
            return self.leaves
    def __It__(self, plant1):
        if self.leaves < plant1.leaves:
            print ("{} has more leaves than {}".format(plant1.plant_name, self.plant_name))
            return self.leaves < plant1.leaves
        elif self.leaves > plant1.leaves:
            print ("{} has more leaves than {}".format(self.plant_name, plant1.plant_name))
            return self.leaves < plant1.leaves

class Flower(Plant):
    def __init__(self, color : str, petals : int):
        self.color = color
        self.petals = petals

    def pick_petal(self.petals)
        self.petals += 1

作业的准确措辞:

创建一个名为 Flower 的新类。花是植物类的子类;所以除了名字和叶子之外,它还添加了 2 个新属性;颜色, 花瓣.颜色是一个包含花颜色的字符串,而花瓣是一个整数,其中包含花上的花瓣数量。您应该能够创建一个 init 方法来设置实例。使用 init 你应该调用一个 UNBOUND 方法来设置植物的名字和叶子。此外,创建一个名为 pick_petal 的方法,用于减少花上花瓣的数量。

【问题讨论】:

  • “对 Plant 的 UNBOUND 方法调用”?
  • 是什么让您认为您需要一个未绑定的呼叫?你几乎肯定不会。
  • 这是我正在处理的任务的要求。这是我完全不明白的唯一部分。
  • 您可能应该发布问题的确切措辞。事实上,这没有任何意义,让我们认为设置作业的人根本不了解 Python。
  • @DanielRoseman -- 根据我在这里看到的一些作业,我不会惊讶地看到另一个人设置了毫无意义的作业: -)

标签: python class python-3.x methods subclass


【解决方案1】:

“未绑定的方法调用”意味着您调用的是类上的方法,而不是类的实例。这意味着类似于Plant.some_method

在这种情况下唯一有意义的非绑定调用是调用基类的__init__ 方法。这似乎满足了“设置名称和叶子”的要求,并且是过去常见的继承方式。

看起来像这样:

class Flower(Plant):
    def __init__(self, name, leaves, color, petals):
        Plant.__init__(self, ...)
        ...

您需要将适当的参数传递给__init__。第一个是self,其余由基类中的Plant.__init__ 定义。您还需要修复参数列表的语法,因为 `color : str' 不是有效的 python。


注意:一般来说,更好的解决方案是调用super,而不是对父类__init__进行未绑定的方法调用。不过,我不确定你能用这个建议做什么。也许教练让你在学习新方法之前先继承旧方法?

对于此作业,您可能应该使用Plant.__init__(...),因为这是作业明确要求您执行的操作。你可以跟导师一起询问super

【讨论】:

  • 应该是def __init__(self, name : str, leaves : int, color : str, petals : int):
  • @PauloScardine:你是对的。我最初保留了问题中所写的代码,但经过进一步思考,我决定接受您的建议。感谢您的反馈。
【解决方案2】:

Bryan 的回答非常完美。只是为了完成:

# Looks like the assignment asks for this
class Flower(Plant):
    def __init__(self, name, leaves, color, petals):
        # call __init__ from parent so you don't repeat code already there
        Plant.__init__(self, name, leaves)  
        self.color = color
        self.petals = petals

这是“经典”、“非合作”的继承风格,很久以前(截至 2016 年近 15 年)就已经过时了,因为它打破了多重继承。有关参考,请参阅 BDFL 的帖子“Unifying types and classes in Python 2.2”。起初我认为它可能是一个非常古老的赋值,但我看到赋值使用“新式”继承(从object 继承是 Python 2 中新式的签名,因为默认是旧式,在 Python 3 中只有新样式)。为了使其适用于多重继承,我们不显式调用父类(Plant.__init__ 语句),而是在 Python 2 中像这样使用super 函数:

        super(Flower, self).__init__(name, leaves)

或者只是在 Python 3 之后(准确地说是在 PEP 0367 之后):

        super().__init__(name, leaves)

即使在 Python 3 中新式继承是默认的,我们仍然鼓励您显式地从 object 继承。

【讨论】:

  • 这更像是一个评论而不是一个答案,它只是作为一个答案发布,因为它对于评论系统来说太长了。
猜你喜欢
  • 1970-01-01
  • 2020-08-10
  • 2020-12-27
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多