title: Why does @abstractmethod need to be used in a class whose metaclass is derived from ABCMeta?
body: <p><a href="https://www.python.org/dev/peps/pep-3119/" rel="noreferrer">PEP 3119</a> states that: </p>
  
  <blockquote>
    <p>The <code>@abstractmethod</code> decorator should only be used inside a class body, and only for classes whose metaclass is (derived from) <code>ABCMeta</code>. Dynamically adding abstract methods to a class, or attempting to modify the abstraction status of a method or class once it is created, are not supported.</p>
  </blockquote>
  
  <p>I cannot find, however, an explanation of why that is. Specifically, I do not notice a difference in behavior when using only <code>@abstractmethod</code> in a class that does not explicitly inherit from <code>ABCMeta</code>. In the following simple example, if I understand correctly, the proper way of doing things would be:</p>
  
  <pre><code>import six
  from abc import ABCMeta
  from abc import abstractmethod
  
  class Base(six.with_metaclass(ABCMeta)):
      def __init__(self):
          print('Init abstract base')
  
      @abstractmethod
      def do_something(self):
          pass
  
  class Subclass(Base):
      def __init__(self):
          super(Subclass, self).__init__()
  
      def do_something(self):
          print('Done.')
  
  sub = Subclass()
  sub.do_something()
  </code></pre>
  
  <p>However, if I let the <code>Base</code> class inherit simply from <code>object</code>, and only use the decorator when needed, I notice no change in behavior. </p>
  
  <pre><code>from abc import abstractmethod
  
  class Base(object):
      def __init__(self):
          print('Init abstract base')
  
      @abstractmethod
      def do_something(self):
          pass
  
  class Subclass(Base):
      def __init__(self):
          super(Subclass, self).__init__()
  
      def do_something(self):
          print('Done.')
  
  sub = Subclass()
  sub.do_something()
  </code></pre>
  
  <p>I have found this to be the case even on more complex architectures, so I wonder: when does the latter method fail?</p>