распаковать из родительского класса

Итак, я делал ролевую игру и столкнулся с некоторыми проблемами с наследованием и распаковкой. Я попытался сделать простую версию проблемы, с которой я сталкиваюсь:

class Animal():
    def __init__(self,name):
        self.name = name
    def say_noise(self):
        noise = "I am an animal"
        by_who = "Animal"
        return noise,by_who
class Dog(Animal):
    def __init__(self,name):
        self.name = name
    def say_noise(self):
        Animal.say_noise(self)

animal = Animal("man")
doggy = Dog("name")

Что я хочу сделать, так это вернуть те же две вещи в классе Animal и классе Dog. Теперь, когда я делаю say_noise() с моим Animal, он работает нормально, поскольку возвращает:

('I am an animal', 'Animal')

Однако он ничего не возвращает, когда я делаю это с классом Dog, и я также пытался их распаковать (что я и собираюсь сделать в своем реальном коде), но когда я это делаю.

a,b =doggy.say_noise()

он просто возвращает это:

TypeError: невозможно распаковать неитерируемый объект NoneType

Как я могу вернуть то же самое с тем же методом класса, только унаследовав его от родительского класса?


person Mads Lildholdt Hansen    schedule 14.01.2020    source источник
comment
Вам нужно добавить оператор возврата в Dog.say_noise, например. return Animal.say_noise(self)   -  person Heike    schedule 14.01.2020
comment
Также обратите внимание, что вам нужно переопределить родительские методы только в том случае, если вы хотите изменить их поведение - например, в вашем случае метод Dog.__init__() является просто копией-вставкой Animal.__init__(), поэтому вы должны просто удалить его.   -  person bruno desthuilliers    schedule 14.01.2020


Ответы (1)


Это потому, что вы ничего не возвращаете из метода Dog классов say_noise. Обновите свой код следующим образом:

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

    def say_noise(self):
        noise = "I am an animal"
        by_who = "Animal"
        return noise, by_who


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

    def say_noise(self):
        return Animal.say_noise(self)


animal = Animal("man")
doggy = Dog("name")
a, b = doggy.say_noise()
person Sazzadur Rahman    schedule 14.01.2020
comment
Или лучше: return super(Dog, self).say_noise() (или просто return super().say_noise(), если вы используете py3 и не заботитесь о совместимости с py2). - person bruno desthuilliers; 14.01.2020
comment
Конечно лучше, я просто попытался указать на проблему :) - person Sazzadur Rahman; 14.01.2020
comment
Спасибо, Саззадур. Это имеет смысл. Бруно, я не понимаю, что ты имеешь в виду. что супер? - person Mads Lildholdt Hansen; 14.01.2020