Difference between staticmethod and classmethod

后端 未结 28 2092
一整个雨季
一整个雨季 2020-11-21 06:11

What is the difference between a function decorated with @staticmethod and one decorated with @classmethod?

28条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-21 06:57

    I started learning programming language with C++ and then Java and then Python and so this question bothered me a lot as well, until I understood the simple usage of each.

    Class Method: Python unlike Java and C++ doesn't have constructor overloading. And so to achieve this you could use classmethod. Following example will explain this

    Let's consider we have a Person class which takes two arguments first_name and last_name and creates the instance of Person.

    class Person(object):
    
        def __init__(self, first_name, last_name):
            self.first_name = first_name
            self.last_name = last_name
    

    Now, if the requirement comes where you need to create a class using a single name only, just a first_name, you can't do something like this in Python.

    This will give you an error when you will try to create an object (instance).

    class Person(object):
    
        def __init__(self, first_name, last_name):
            self.first_name = first_name
            self.last_name = last_name
    
        def __init__(self, first_name):
            self.first_name = first_name
    

    However, you could achieve the same thing using @classmethod as mentioned below

    class Person(object):
    
        def __init__(self, first_name, last_name):
            self.first_name = first_name
            self.last_name = last_name
    
        @classmethod
        def get_person(cls, first_name):
            return cls(first_name, "")
    

    Static Method: This is rather simple, it's not bound to instance or class and you can simply call that using class name.

    So let's say in above example you need a validation that first_name should not exceed 20 characters, you can simply do this.

    @staticmethod  
    def validate_name(name):
        return len(name) <= 20
    

    and you could simply call using class name

    Person.validate_name("Gaurang Shah")
    

提交回复
热议问题