Python 如何重写一个方法?

Python 如何重写一个方法?,python,python-3.x,Python,Python 3.x,因此,我尝试用python制作一个单词,它打印出动物的运动、声音和栖息地。目前,我有以下代码: class Animal: def __init__(self,name): self._name = name def sound(self): raise Exception("You have not overridden my sound yet!") def move(self): raise Exception("

因此,我尝试用python制作一个单词,它打印出动物的运动、声音和栖息地。目前,我有以下代码:

class Animal:
    def __init__(self,name):
        self._name = name

    def sound(self):
        raise Exception("You have not overridden my sound yet!")

    def move(self):
        raise Exception("You have not overridden my movement yet!")

    def habitat(self):
        raise Exception("You have not overridden my habitat yet!")


class fish(Animal):
    def __init__(self,name):
        self.name=Animal.__init__(name)
    def sound(self):
        return (f'{self.name} says blub blub')
    def movement(self):
        return (f'{self.name} is swimming')
    def habitat(self):
        return (f'{self.name} is an Aquatic Animal')

a=fish('nemo')
print(a.sound())
我不允许编辑动物父类。我希望有一个输出:

nemo says blub blub
我该怎么做?谢谢你的帮助

这很有效

class Animal:
    def __init__(self,name):
        self._name = name

    def sound(self):
        raise Exception("You have not overridden my sound yet!")

    def move(self):
        raise Exception("You have not overridden my movement yet!")

    def habitat(self):
        raise Exception("You have not overridden my habitat yet!")


class fish(Animal):
    def __init__(self,name):
        super().__init__(name)
        self.name = self._name
    def sound(self):
        return (f'{self.name} says blub blub')
    def movement(self):
        return (f'{self.name} is swimming')
    def habitat(self):
        return (f'{self.name} is an Aquatic Animal')

a=fish('nemo')
print(a.sound())
我修复了你的
\uuuu init\uuuu
打字错误,我想你要做的是初始化超类,所以我在
fish
init中做了这件事

您在方法中使用了
self.name
,因此我也在init中设置了它,尽管我认为更好的方法是使用
self.\u name
,它是您从
Animal
继承的


编辑:正如有人指出的,如果您正在这样做(使用self.\u name),那么您实际上根本不需要覆盖
\uuuu init\uuuu
方法,在
Animal
中的方法就可以了。

您在调用父类的init函数时有一些错误理解。以及其他一些事情

类动物:
定义初始化(self,name):
self.\u name=name
def声音(自):
raise NotImplementedError(“您还没有覆盖我的声音!”)
def移动(自我):
raise NotImplementedError(“您还没有覆盖我的移动!”)
def栖息地(自我):
raise NOTEImplementedError(“您还没有覆盖我的栖息地!”)
鱼类(动物)类别:
定义初始化(self,name):
超级(鱼,自我)。\uuuuu初始\uuuuuuuuu(名称)
def声音(自):
返回f'{self.\u name}表示blub blub'
def移动(自):
返回f'{self.\u name}正在游泳'
def栖息地(自我):
返回f'{self.\u name}是水生动物'
a=鱼(“尼莫”)
打印(a.声音()

\uuuu init
应该是
\uuuu init\uuuuu
但是
self.name=Animal.\uuuuu init\uuuuu(name)
没有任何意义,
\uuuu init\uuuuuu
不会返回任何内容。你为什么要这样做?@Stael,抓得好!现在代码引发了一个self.name=Animal.\uuuuu init\uuuu(name)TypeError:\uuuu init\uuuu()缺少一个必需的位置参数:“name”我不明白,我有一个参数名就在那里。@Monsi这不是继承的方式,应该调用
super()
来获取父类,未将子类的属性定义为超类的实例。为什么要重写
\uuuu init\uuuu
?!没必要这么做!您好,谢谢您,但我可以问一下“名称”是什么,它与“名称”有什么区别吗?这只是命名上的区别。按约定,以
开头的变量被设计为不被对象之外的任何对象使用(例如,您不调用
Fish.\uuuu init\uuuu(名称)
,您调用
Fish(名称)
)。它们只是对象中的不同属性,如果
动物
类使用
名称
,那么您也可以使用它,而不是定义一个
名称
。按照惯例,所有类都是大写的,以区别于该类的实例(对象),因此
nemo=Fish('nemo'))
a_fish=fish('nemo')
哦,好的,我想我现在明白了,谢谢你的帮助!最后一件事,为什么调用super()比只调用“Animal.method”更好?这只是一个好的实践还是有更重要的原因?噢,谢谢你提醒我!哈哈哈,我的教授已经指出,我想让你帮忙,但是如果我可以问的话,我知道super()调用继承类。如果我在super()中定义了一些东西,比如你在这里所做的,会发生什么呢?另外,我不明白为什么调用super()比调用‘Animal.method’更好?这只是一个好的实践还是有一个更重要的原因?看看这个:现在您已经将
Fish
改为使用
self.\u name
(我认为这是一个很好的举动),这意味着整个
\u init\u()
Fish
中的
方法是多余的,可以删除,这是完全正确的哈哈