title: Dynamically loaded subclass can still instanstiate even without all abstract methods overridden
body: <p>Setup: Python 3.3</p>
  
  <p>I have a base class, called SourceBase, which defines abstract methods and values:</p>
  
  <pre><code>import abc
  
  class SourceBase(object):
      __metaclass__=abc.ABCMeta
      pluginid='undefined' #OVERRIDE THIS IN YOUR SUBCLASS. If you don't, the program will ignore your plugin.
  
      @abc.abstractmethod
      def get_images(self):
          '''This method should return a list of URLs.'''
          return
  
      @abc.abstractmethod
      def get_source_info(self):
          '''This method should return a list containing a human friendly name at index 0, and a human readable url describing the source for this repository.
          For example, the EarthPorn subreddit returns a list ['EarthPorn Subreddit', 'http://reddit.com/r/EarthPorn'].
          This is used to populate the treeview object with your source information.'''
          return
  
      @abc.abstractmethod
      def get_pluginid(self):
          '''This method should return a string that represents this plugins ID.
          The pluginid is used to make calls to this plugin when necessary. It should be unique as ids are in a shared pool,
          so make sure the id is unique. The id should remain the same even when updated as some settings with the pluginid 
          are persisted by the main application, and they will be lost if the id changes.
          '''
          return
  </code></pre>
  
  <p>This is the superclass of some python plugins I wrote, which subclass this. They are dynamically loaded at runtime, and all of this works, except that even though I added a new abstract method to my SourceBase, the plugins still load. They shouldn't, since none of them have my new method. (I gave it the @abc.abstractmethod marking). </p>
  
  <p>My google-fu doesn't really show anything, so I'm not sure why I can still instanstiate these plugins even though the superclass says they are abstract.</p>
  
  <p>For example, in SourceBase, I added:</p>
  
  <pre><code>@abc.abstractmethod
  def get_dependencies(self):
      print('ERROR: THIS PLUGIN SHOULD NOT HAVE LOADED.')
      '''This method should return a list of package names. The host program will check if these packages are available.
      If they are not available, the plugin will be disabled, but the user will be able to elect to install these packages.'''
      return
  </code></pre>
  
  <p>I did not define this method in my plugins, but I still get this output on the terminal:</p>
  
  <pre><code>....
  Screen Height:1080
  Screen Width:1920
  files:  ['bingIOTD.py', 'redditEP.py', 'redditLP.py', '__init__.py']
  ERROR: THIS PLUGIN SHOULD NOT HAVE LOADED. &lt;--abstract method
  </code></pre>
  
  <p>I'm not sure why it is ignoring it, am I missing something...? I've done it before with normal classes that aren't dynamically loaded. Any help is appreciated. I understand I can probably make a workaround (make a default return, check for that), but that doesn't seem to be the right way.</p>
  
  <p>If you need more sourcecode my project is on SourceForge <a href="https://sourceforge.net/projects/earthporndownloader/" rel="nofollow">here.</a></p>