Method could be a function — Python Anti-Patterns documentation
When a method is not preceded by the @staticmethod or @classmethod decorators and does not contain any references to the class or instance (via keywords like cls or self), Python raises the Method could be a function error. This is not a critical error, but you should check the code in question in order to determine if this section of code really needs to be defined as a method of this class.
Anti-pattern¶
In the Rectangle class below the area method calculates the area of any rectangle given a width and a height.
class Rectangle: def __init__(self, width, height): self.width = width self.height = height self.area = width * height # should be preceded by @staticmethod here def area(width, height): return width * height
area causes the Method could be a function error because it is ambiguous. It does not reference the instance or class using the self or cls keywords and it is not preceded by the @staticmethod decorator.
Class method is not preceded by @classmethod decorator¶
In the Rectangle class below the print_class_name method prints the name of the class. Again, Python raises the Method could be a function error because the method does not reference any class members or methods and is not preceded by the @classmethod decorator.
Furthermore, the first argument of a class method must be a reference to the class itself.
class Rectangle: def __init__(self, width, height): self.width = width self.height = height self.area = width * height # should be preceded by @classmethod here # missing required first argument "cls" def print_class_name(): print("class name: Rectangle")
Best practices¶
Add the @staticmethod decorator before the static method¶
All static methods must be preceded by the @staticmethod decorator.
class Rectangle: # clarifies that this is a static method and belongs here @staticmethod def area(width, height): return width * height
Add the @classmethod decorator before the class method¶
All class methods must be preceded by the @classmethod decorator. Furthermore, the first argument of any class method must be cls, which is a reference to the class itself.
class Rectangle: @classmethod def print_class_name(cls): # "class name: Rectangle" print("class name: {0}".format(cls))
References¶
- PyLint - R0201, no-self-use