gpt4 book ai didi

python - 声明子类而不传递 self

转载 作者:太空狗 更新时间:2023-10-30 00:09:07 25 4
gpt4 key购买 nike

我有一个抽象基类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): 的调用有效。

问题:

  1. 我在实现 __str__(self):

    时才发现这个错误

    在 Python 3.x 中,当从不带参数的子级调用父级构造函数时,是否需要传递 self

  2. 假设 MountainBike 现在设置 cadencegearspeed 这意味着在我的子类中构造函数将如下所示:

    class MountainBike(Bicycle):

    def __init__(self, cadence, gear, speed):
    super().__init__(cadence,gear,speed)

请注意,self 没有被传递到 super 中,因为据我所知,它可以取消变量赋值。这个假设是否正确?

最佳答案

self 被隐式传递给 super 调用,所以添加它显式发送它两次:

def __init__(self):
super().__init__(self)

这最终会调用 Bicycle(self, self),这与 Bicycle(self, cadence=self) 相同。

稍后,您可能尝试将您的实例转换为 str(例如打印它),所以这被称为:

def __str__(self):
return "Cadence: {0} Gear: {1} Speed: {2}".format(self._cadence,
self._gear, self._speed)

该代码试图将 self._cadence 转换为字符串,而 self._cadenceself 因为之前的错误,所以它继续在无尽的递归中(直到递归异常)。


请注意,super() 有两种形式:带参数和不带参数,因此有两种正确的方法来修复代码。

Python 3 方式(不带参数):

def __init__(self):
super().__init__()

旧的 Python 2 方式,更明确:

def __init__(self):
super(MountainBike, self).__init__()

两者做同样的事情,即它们为您提供绑定(bind)的 __init__ 方法,该方法已经具有隐式的 self

另见此处:https://docs.python.org/3/library/functions.html#super

关于python - 声明子类而不传递 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50437465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com