109

In older Python versions when you create a class, it can inherit from object which is as far I understand a special built-in Python element that allows your class to be a new-style class.

What about newer versions (> 3.0 and 2.6)? I googled about the object class but I get so many results (for obvious reasons).

3
  • 2
    If your code will also be used under 2.x, it's good to be explicit. Commented Aug 24, 2011 at 18:18
  • 2
    It's well answered in this question: stackoverflow.com/questions/4015417/… Commented Jun 18, 2019 at 0:58
  • Agreed; the main question is version-agnostic now, so this is a duplicate. Commented Mar 27, 2023 at 23:01

2 Answers 2

118

You don't need to inherit from object to have new style in python 3. All classes are new-style.

Sign up to request clarification or add additional context in comments.

3 Comments

Notice that this means all classes inherit from object regardless if typing an explicit (object) or not in Python 3.1
You don't have to, but the "Porting Python code to Python 3" says that it's still valid: docs.python.org/py3k/howto/pyporting.html#subclass-object Also: docs.python.org/reference/…
From this post mentioned in nngeek's comment, seems like a good stable reference for old-style vs. new-style (only really relevant to Py2) is: docs.python.org/2/reference/… - the above links seemed to have since changed.
94

I realise that this is an old question, but it is worth noting that even in python 3 these two things are not quite the same thing.

If you explicitly inherit from object, what you are actually doing is inheriting from builtins.object regardless of what that points to at the time.

Therefore, I could have some (very wacky) module which overrides object for some reason. We'll call this first module "newobj.py":

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

Then in some other file ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Then in a third file (which we can actually run):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

So you can see that, in the case where it is explicitly inheriting from object, we get a different behaviour than where you allow the implicit inheritance.

2 Comments

It's relevant because in general the expectance is that the behaviour is equivalent. It isn't equivalent, hence my observations.
Don't you just hate it when someone deletes their comments so it looks like you're talking to yourself?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.