1

What is the pythonic way to have an intermediate class that overwrites some of the method’s from an Abstract parent, but not all. Must it also overwrite methods it does not wish to change?

class Animal(six.with_metaclass(ABCMeta, object)):):

    @abstractmethod
    def move(self):
        raise NotImplementedError()

    @abstractmethod
    def give_birth(self):
        raise NotImplementedError()

class Mammal(Animal):


   def move(self): # I want to inherit this method from Animal
        raise NotImplementedError()

    def give_birth(self):  # want to overwrite
        # not with eggs!



class Dog(Mammal):
    def move(self):
       return 'MOVED like a dog'

This code doesn’t actually break, but my IDE (pycharm) highlights “class Mammal” and says “must implement all abstract methods". Maybe Animal.move shouldn't be abstract?

6
  • You want to inherit move from Animal but it's an abstract method so it doesn't have an implementation in Animal. You'll have to make a concrete implementation of Animal.move (i.e. not an abstractmethod) if you want to inherit it as you say. What exactly is confusing you? Commented Aug 6, 2018 at 14:43
  • unfortunate that I am forced to replace Animal.get_move with identical code. Thought there might be a better way. Commented Aug 6, 2018 at 14:46
  • I don't understand, what is Animal.get_move? What identical code, I don't see any code repitition? Why is this solution not satisfactory? Can you be a bit more clear? Commented Aug 6, 2018 at 14:48
  • I think I would ignore the IDE warning. Mammal is essentially an abstract class as well. Commented Aug 6, 2018 at 14:51
  • Sorry. I edited the question to reflect that I only want to implement Dog.move, not Mammal.move. I think solution is to remove the decorator above Animal.move's definition Commented Aug 6, 2018 at 14:51

1 Answer 1

4

You can make Mammal an abstract class as well, and it will not be required to implement the methods

from abc import ABC

class Animal(ABC):  # I've never used six, but your way of doing things should work here too
    @abstractmethod
    def move(self):
        raise NotImplementedError()    
    @abstractmethod
    def give_birth(self):
        raise NotImplementedError()

class Mammal(Animal, ABC):
    def give_birth(self):  # want to overwrite
        print("Live birth")

class Dog(Mammal):
    def move(self):
        print("Run in circles")
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.