如何调用子类中的父类?

时间:2016-04-28 16:11:49

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

我需要创建一个UNBOUND方法调用Plant来设置名称和离开,我不知道如何。任何帮助表示赞赏。

我的代码:

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个新属性;颜色,花瓣。颜色是包含花的颜色的字符串,花瓣是具有花朵上的花瓣数量的int。您应该能够创建 init 方法来设置实例。使用init,您应该对工厂进行UNBOUND方法调用以设置名称并离开。另外,创建一个名为pick_petal的方法,减少花上花瓣的数量。

2 个答案:

答案 0 :(得分:3)

&#34;未绑定的方法调用&#34;意味着您在类上调用方法而不是在类的实例上调用方法。这意味着Plant.some_method之类的东西。

在此上下文中唯一有意义的未绑定调用是调用基类的__init__方法。这似乎满足了设置名称和离开&#34;的要求,并且在过去是继承的常用方法。

看起来像这样:

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

您需要将适当的参数传递给__init__。第一个是self,其余的由基类中的Plant.__init__定义。您还需要修复参数列表的语法,如`color:str&#39;是无效的python。

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

对于此作业,您应该使用Plant.__init__(...),因为该作业明确要求您这样做。您可以跟进讲师询问super

答案 1 :(得分:1)

布莱恩的答案是完美的。只是为了完成:

# 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