【发布时间】:2018-10-30 10:31:19
【问题描述】:
我有一个抽象基类Bicycle:
from abc import ABC, abstractmethod
class Bicycle(ABC):
def __init__(self, cadence = 10, gear = 10, speed = 10):
self._cadence = cadence
self._gear = gear
self._speed = speed
@abstractmethod
def ride(self):
pass
def __str__(self):
return "Cadence: {0} Gear: {1} Speed: {2}".format(self._cadence,
self._gear, self._speed)
和一个子类MountainBike:
from Bicycle import Bicycle
class MountainBike(Bicycle):
def __init__(self):
super().__init__(self)
def ride(self):
return "Riding my Bike"
以下代码将导致recursion error,但如果我从super().__init__(self) 中删除self,则对__str__(self): 的调用有效。
问题:
-
我在实现
__str__(self):时才发现这个错误在 Python 3.x 中,从不带参数的子级调用父构造函数时,是否需要传递
self? -
假设
MountainBike现在设置了cadence、gear、speed,这意味着在我的子类中,构造函数将如下所示:class MountainBike(Bicycle): def __init__(self, cadence, gear, speed): super().__init__(cadence,gear,speed)
注意,self 没有在 super 中传递,因为据我所知,它可以使变量赋值失效。这个假设正确吗?
【问题讨论】:
-
在 python 3 中,
self是不需要的,因为我相信super可以为您做到这一点,所以:super().__init__()就足够了(根据您的情况加上cadence,gear,speed)。 -
所以,无论有无参数,都不需要传递
self,对吗? -
没错。
-
根据官方文档,它被列为强制。 docs.python.org/3/reference/datamodel.html#object.__init__
-
对。它在第一个
__init__中是强制性的,但应该在super().__init__()中省略,因为它已经隐式传递到那里。
标签: python python-3.x