@staticmethod / @classmethod用法

 
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
 
 
 
静态方法的使用场景:
如果在方法中不需要访问任何实例方法和属性,纯粹地通过传入参数并返回数据的功能性方法,那么它就适合用静态方法来定义,
它节省了实例化对象的开销成本,往往这种方法放在类外面的模块层作为一个函数存在也是没问题的,而放在类中,仅为这个类服务。
类方法的使用场景有:
作为工厂方法创建实例对象,例如内置模块 datetime.date 类中就有大量使用类方法作为工厂方法,以此来创建date对象
class A(object):
    bar = 1
    def foo(self):
        print('普通函数')
        print(A.bar)
    @staticmethod
    def static_foo():
        print('这是静态方法,调用时不用实例化')
        print(A.bar)
    @classmethod
    def class_foo(cls):
        print('这是类方法,调用时不用实例化, 且可以调用类的属性,方法,如下')
        print(cls.bar)
        cls().foo()
        cls().static_foo()
 
if __name__ == "__main__":
    A().foo()
    A.static_foo()
    A.class_foo()
 
 
原文地址:https://www.cnblogs.com/dearddu/p/12457140.html