静态方法staticmethod和类方法classmethod

非原创,参考https://blog.csdn.net/u014745194/article/details/73392550

@staticmethod装饰的的方法,在类中可以通过类名直接访问,也可以通过实例调用,且该方法定义时不需要self

静态方法是一类特殊的方法,有时你可能需要写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身,例如:


   @staticmethod

    def mix_ingredients(x, y):

        returnx + y

    def cook(self):

    return self.mix_ingredients(self.cheese, self.vegetables)

优点

可读性更好的代码,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态。
可以在子类中被覆盖,如果是把mix_ingredients作为模块的顶层函数,那么继承自Pizza的子类就没法改变pizza的mix_ingredients了如果不覆盖cook的话。

@classmethod装饰的方法,既可以通过类名直接访问,也可以通过实例名访问,但调用时首先会将当前类传递进去。类方法不是绑定到对象上,而是绑定在类上的方法

>>> class Pizza(object):
...   radius = 42
...   @classmethod
...   def get_radius(cls):
...     return cls.radius
... 
>>> 
>>> Pizza.get_radius
>
>>> Pizza().get_radius
>
>>> Pizza.get_radius is Pizza().get_radius
True
>>> Pizza.get_radius()
42

无论你用哪种方式访问这个方法,它总是绑定到了这个类身上,它的第一个参数是这个类本身(记住:类也是对象)。
什么时候使用这种方法呢?类方法通常在以下两种场景是非常有用的:

  • 工厂方法:它用于创建类的实例,例如一些预处理。如果使用@staticmethod代替,那我们不得不硬编码Pizza类名在函数中,这使得任何继承Pizza的类都不能使用我们这个工厂方法给它自己用。
  • 调用静态类:如果你把一个静态方法拆分成多个静态方法,除非你使用类方法,否则你还是得硬编码类名。使用这种方式声明方法,Pizza类名明永远都不会在被直接引用,继承和方法覆盖都可以完美的工作。

你可能感兴趣的:(静态方法staticmethod和类方法classmethod)