title: What's the difference between the mro method and the __mro__ attribute of a class?
body: <p>I stumbled across this extra, no-underscores <code>mro</code> method when I was using <code>__metaclass__ = abc.ABCMeta</code>. It seems to be the same as <code>__mro__</code> except that it returns a list instead of a tuple. Here's a random example (<a href="http://ideone.com/aEhzAw" rel="noreferrer">ideone snippet</a>):</p>
  
  <pre><code>import abc
  import copy
  
  class Life(object):
      __metaclass__ = abc.ABCMeta
  
      @abc.abstractmethod
      def reproduce(self):
          pass
  
  class Bacterium(Life):
      def reproduce(self):
          return copy.deepcopy(self)
  
  wiggly = Bacterium()
  
  print wiggly.__class__.__mro__
  # (&lt;class '__main__.Bacterium'&gt;, &lt;class '__main__.Life'&gt;, &lt;type 'object'&gt;)
  
  print wiggly.__class__.mro()
  # [&lt;class '__main__.Bacterium'&gt;, &lt;class '__main__.Life'&gt;, &lt;type 'object'&gt;]
  </code></pre>
  
  <p>I found later that this isn't unique to <code>ABCMeta</code> but is available in all new-style classes.</p>
  
  <p>So... why? What is this doing that <code>__mro__</code> isn't?</p>