title: Why can I instantiate an abstract class without implementing an abstractmethod?
body: <p>Trying to understand abstract classes, I created a simple model:</p>
  <pre class="lang-py prettyprint-override"><code>from abc import ABC, abstractmethod
  
  class Publication(ABC):
      def __init__(self, title):
          self.title = title
  
      @abstractmethod
      def Description(self):
          pass
  
  class Periodical(Publication):
      def __init__(self, title, publisher):
          super().__init__(title)
          self.publisher = publisher
  
  class Book(Publication):
      def __init__(self, title, author):
          super().__init__(title)
          self.author = author
  
      def Description(self):
          print(f'Book: {self.title} ({self.author})')
  
  class Magazine(Periodical):
      def __init__(self, title, publisher):
          super().__init__(title, publisher)
  
      def Description(self):
          print(f'Magazine: {self.title} ({self.publisher})')
  
  class Newspaper(Periodical):
      def __init__(self, title, publisher):
          super().__init__(title, publisher)
  
      def Description(self):
          print(f'Newspaper: {self.title} ({self.publisher})')
  
  book = Book('Thoughts', 'A. Einstein')
  magazine = Magazine('Sailing', 'M. Polo')
  newspaper = Newspaper('Daily Joke', 'Ms. Maisel')
  
  book.Description()
  magazine.Description()
  newspaper.Description()
  </code></pre>
  <p>In <code>Publication</code> I define <code>Description()</code> as abstract method. If I don't implement it, e.g. in class <code>Newspaper</code>, an error is thrown: <code>TypeError: Can't instantiate abstract class Newspaper with abstract method Description</code>. That's what I intended.</p>
  <p>But why is it possible to create <code>Periodical</code> from <code>Publication</code> without implementing <code>Description()</code>?</p>