‘super’ in old style class¶
ID: py/super-in-old-style
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- portability
- correctness
Query suites:
- python-security-and-quality.qls
Click to see the query in the CodeQL repository
The ability to access inherited methods that have been overridden in a class using super()
is supported only by new-style classes. When you use the super()
function in an old-style class it fails.
Recommendation¶
If you want to access inherited methods using the super()
built-in, then ensure that the class is a new-style class. You can convert an old-style class to a new-style class by inheriting from object
. Alternatively, you can call the __init__
method of the superclass directly from an old-style class using: BaseClass.__init__(...)
.
Example¶
In the following example, PythonModule
is an old-style class as it inherits from another old-style class. If the _ModuleIteratorHelper
class cannot be converted into a new-style class, then the call to super()
must be replaced. The PythonModule2
class demonstrates the correct way to call a superclass from an old-style class.
class PythonModule(_ModuleIteratorHelper): # '_ModuleIteratorHelper' and 'PythonModule' are old-style classes
# class definitions ....
def walkModules(self, importPackages=False):
if importPackages and self.isPackage():
self.load()
return super(PythonModule, self).walkModules(importPackages=importPackages) # super() will fail
class PythonModule2(_ModuleIteratorHelper): # call to super replaced with direct call to class
# class definitions ....
def walkModules(self, importPackages=False):
if importPackages and self.isPackage():
self.load()
return _ModuleIteratorHelper.__init__(PythonModule, self).walkModules(importPackages=importPackages)
References¶
Python Glossary: New-style class.
Python Language Reference: New-style and classic classes.
Python Standard Library: super.