我需要创建一个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的方法,减少花上花瓣的数量。
答案 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
。