Как изменить / переопределить унаследованную функцию класса в Python? - PullRequest
0 голосов
/ 25 января 2019

У меня есть точное имя функции say_hello в родительском и унаследованном классе. Я хочу указать параметр name в классе Kitten, но позволяет пользователю указать параметр в классе Cat.

Есть ли способ избежать необходимости повторять строку 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 голосов
/ 25 января 2019

Я думаю, что вы можете упустить момент о занятиях здесь, что имеет решающее значение для того, чего вы хотите достичь.

Давайте сначала определим класс 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 является объектом класса, но не экземпляром. Вам нужно создать экземпляр своего класса.

Сделав это в моем коде cat = Cat("Sally"), Python вызывает метод __init__ класса и возвращает его экземпляр с каждым набором / выполнением, как указано в методе __init__.

В моем случае я установил self.name = name, что делает, например, значение self.name равным "Sally".

Поэтому всякий раз, когда я вызываю self.name в методе, который включает в себя self в своих параметрах, он становится, после создания экземпляра, «Салли».

Теперь класс 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)

При этом у Kitten-, как у экземпляра Cat, есть имя, и он наследует метод say_hello(), чтобы сказать, что это имя.

Надеюсь, это поможет.

0 голосов
/ 25 января 2019

Метод 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
...