Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between the mro method and the __mro__ attribute of a class?

I stumbled across this extra, no-underscores mro method when I was using __metaclass__ = abc.ABCMeta. It seems to be the same as __mro__ except that it returns a list instead of a tuple. Here's a random example (ideone snippet):

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__
# (<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>)

print wiggly.__class__.mro()
# [<class '__main__.Bacterium'>, <class '__main__.Life'>, <type 'object'>]

I found later that this isn't unique to ABCMeta but is available in all new-style classes.

So... why? What is this doing that __mro__ isn't?

like image 694
Air Avatar asked Oct 31 '13 18:10

Air


People also ask

What is __ MRO __ in Python?

Method Resolution Order(MRO) it denotes the way a programming language resolves a method or attribute. Python supports classes inheriting from other classes. The class being inherited is called the Parent or Superclass, while the class that inherits is called the Child or Subclass.

What is MRO method?

The Method Resolution Order (MRO) is the set of rules that construct the linearization. In the Python literature, the idiom "the MRO of C" is also used as a synonymous for the linearization of the class C.

How do you fetch the MRO of any object class in Python?

To get the MRO of a class, you can use either the __mro__ attribute or the mro() method. The __mro__ attribute returns a tuple, but the mro() method returns a python list.

What is __ bases __ in Python?

Python provides a __bases__ attribute on each class that can be used to obtain a list of classes the given class inherits. The __bases__ property of the class contains a list of all the base classes that the given class inherits.


1 Answers

Directly from the documentation:

This method can be overridden by a metaclass to customize the method resolution order for its instances. It is called at class instantiation, and its result is stored in _mro_.

So, mro() is called on instantiation and caches its result in __mro__. They have the same purpose.

like image 142
jeromej Avatar answered Sep 18 '22 02:09

jeromej