如何在python中修改/覆盖继承的类函数?

时间:2019-01-25 19:13:18

标签: python-3.x class inheritance override

在父类和继承的类中,我都有确切的函数名称say_hello。我想在Kitten类中指定参数name,但允许用户在Cat类中指定参数。

是否可以避免在Kitten类的return ('Hello '+name)函数中重复行say_hello的需要?

当前:

class Cat:
    def __init__(self):
        pass

    def say_hello(name):
        return ('Hello '+name)

class Kitten(Cat):
    def __init__(self):
        super().__init__()

    def say_hello(name='Thomas'):
        return ('Hello '+name)

x = Cat
print (x.say_hello("Sally"))
y = Kitten
print (y.say_hello())

理想情况:

class Cat:
    def __init__(self):
        pass

    def say_hello(name):
        return ('Hello '+name)

class Kitten(Cat):
    def __init__(self):
        super().__init__()

    def say_hello():
        return super().say_hello(name='Thomas') # Something like this, so this portion of the code doesn't need to repeat completely

2 个答案:

答案 0 :(得分:1)

say_hello方法应包含self作为第一个参数,以便它可以使用super()函数来访问父级的say_hello方法。您还应该通过用括号调用该类来实例化该类:

class Cat:
    def say_hello(self, name):
        return 'Hello ' + name

class Kitten(Cat):
    def say_hello(self, name='Thomas'):
        return super().say_hello(name)

x = Cat()
print(x.say_hello("Sally"))
y = Kitten()
print(y.say_hello())

这将输出:

Hello Sally
Hello Thomas

答案 1 :(得分:0)

我认为您可能会错过关于课程的知识,这对您想要实现的目标至关重要。

让我们首先定义一个类Cat,但仔细研究一下与您的区别。

class Cat:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        return self.name

现在看魔术,我稍后再解释:

cat = Cat("Sally")
print(cat.say_hello())
>>> "Sally"

与您的代码相比,发生了什么?

首先,您的__init__方法不带参数。我的版本是name。此外,我将其分配给实例变量self.name。 有了这个赋值,我就可以使用在每个方法中实例化时提供的名称,该方法的第一个参数为self。什么是实例化? 在代码中,您叫x = Cat。 x是该类的对象,而不是Instance。您需要实例化您的课程。

通过在我的代码cat = Cat("Sally")中这样做,python所做的就是调用该类的__init__方法,并按照__init__方法中指定的所有设置/完成返回它的一个实例。

在我的情况下,我将self.name = name设置为self.name的值设为“ Sally”。

因此,每当我在方法中调用self.name时,该方法在其参数中包含self时,实例化后都会变成“ Sally”。

现在应该清除类Cat

现在该怎么办?

仅从此类继承!

请参阅:

class Cat:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        return self.name


class Kitten(Cat):
    def __init__(self, name):
        # This is done for convenience
        super().__init__(name)

以此为例,与Cat实例相同,它有一个名称,并继承了say_hello()方法,以说出它的名称。

我希望这会有所帮助。