Should all Python classes extend object?

PythonInheritance

Python Problem Overview


I have found that both of the following work:

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

Should all Python classes extend object? Are there any potential problems with not extending object?

Python Solutions


Solution 1 - Python

In Python 2, not inheriting from object will create an old-style class, which, amongst other effects, causes type to give different results:

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

vs.

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

Also the rules for multiple inheritance are different in ways that I won't even try to summarize here. All good documentation that I've seen about MI describes new-style classes.

Finally, old-style classes have disappeared in Python 3, and inheritance from object has become implicit. So, always prefer new style classes unless you need backward compat with old software.

Solution 2 - Python

In Python 3, classes extend object implicitly, whether you say so yourself or not.

In Python 2, there's old-style and new-style classes. To signal a class is new-style, you have to inherit explicitly from object. If not, the old-style implementation is used.

You generally want a new-style class. Inherit from object explicitly. Note that this also applies to Python 3 code that aims to be compatible with Python 2.

Solution 3 - Python

In python 3 you can create a class in three different ways & internally they are all equal (see examples). It doesn't matter how you create a class, all classes in python 3 inherits from special class called object. The class object is fundamental class in python and provides lot of functionality like double-underscore methods, descriptors, super() method, property() method etc.

Example 1.

class MyClass:
 pass

Example 2.

class MyClass():
 pass

Example 3.

class MyClass(object):
  pass

Solution 4 - Python

Yes, all Python classes should extend (or rather subclass, this is Python here) object. While normally no serious problems will occur, in some cases (as with multiple inheritance trees) this will be important. This also ensures better compatibility with Python 3.

Solution 5 - Python

As other answers have covered, Python 3 inheritance from object is implicit. But they do not state what you should do and what is convention.

The Python 3 documentation examples all use the following style which is convention, so I suggest you follow this for any future code in Python 3.

class Foo:
    pass

Source: https://docs.python.org/3/tutorial/classes.html#class-objects

Example quote:

> Class objects support two kinds of operations: attribute references > and instantiation. > > Attribute references use the standard syntax used for all attribute > references in Python: obj.name. Valid attribute names are all the > names that were in the class’s namespace when the class object was > created. So, if the class definition looked like this: > > class MyClass: > """A simple example class""" > i = 12345 > > def f(self): > return 'hello world'

Another quote:

> Generally speaking, instance variables are for data unique to each > instance and class variables are for attributes and methods shared by > all instances of the class: > > class Dog: > > kind = 'canine' # class variable shared by all instances > > def init(self, name): > self.name = name # instance variable unique to each instance

Solution 6 - Python

in python3 there isn't a differance, but in python2 not extending object gives you an old-style classes; you'd like to use a new-style class over an old-style class.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKaraView Question on Stackoverflow
Solution 1 - PythonFred FooView Answer on Stackoverflow
Solution 2 - PythonslezicaView Answer on Stackoverflow
Solution 3 - PythonN RandhawaView Answer on Stackoverflow
Solution 4 - PythonpydsignerView Answer on Stackoverflow
Solution 5 - PythonjmozView Answer on Stackoverflow
Solution 6 - PythonthkangView Answer on Stackoverflow