静态方法
静态方法是一类特殊的方法。有时,需要写属于一个类的方法,但是不需要用到对象本身。例如:
class Pizza(object):
@staticmethod
def mix_ingredients(x, y):
return x + y
def cook(self):
return self.mix_ingredients(self.cheese, self.vegetables)
这里将方法mix_ingredients作为一个非静态的方法也可以work,但是给它一个self的参数将没有任何作用。这儿的decorator@staticmethod带来一些特别的东西:
>>> Pizza().cook is Pizza().cook
False
>>> Pizza().mix_ingredients is Pizza().mix_ingredients
True
>>> Pizza().mix_ingredients is Pizza.mix_ingredients
True
>>> Pizza()
<__main__.Pizza object at 0x10314b410>
>>> Pizza()
<__main__.Pizza object at 0x10314b510>
>>>
Python不需要对每个实例化的Pizza对象实例化一个绑定的方法。
绑定的方法同样是对象,创建它们需要付出的代价。这里的静态方法避免了这样的情况:
*降低了阅读代码的难度:看到@staticmethod便知道这个方法不依赖与对象本身的状态;
*允许我们在子类中重载mix_ingredients方法。如果我们使用在模块最顶层定义的函数mix_ingredients,一个继承自Pizza的类若不重载cook,可能不可以改变混合成份(mix_ingredients)的方式。
类方法
类方法是绑定在类而非对象上的方法
>>> 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
False
>>> Pizza.get_radius()
42
不管如何使用这个方法,它总会被绑定在其归属的类上,同时它的第一个参数是类本身(类同样是对象)
类方法一般用于下面两种:
1.工厂方法,被用来创建一个类的实例,完成一些预处理工作。如果使用一个@staticmethod静态方法,我们可能需要在函数中硬编码Pizza类的名称,使得任何继承自Pizza类的类不能使用我们的工厂用作自己的目的。
class Pizza(object):
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def from_fridge(cls, fridge):
return cls(fridge.get_cheese() + fridge.get_vegetables())
2.静态方法调静态方法:如果将一个静态方法分解为几个静态方法,不需要硬编码类名但可以使用类方法。使用这种方式来声明我们的方法,Pizza这个名字不需要直接被引用,并且继承和方法重载将会完美运作。
class Pizza(object):
def __init__(self, radius, height):
self.radius = radius
self.height = height
@staticmethod
def compute_circumference(radius):
return math.pi * (radius ** 2)
@classmethod
def compute_volume(cls, height, radius):
return height * cls.compute_circumference(radius)
def get_volume(self):
return self.compute_volume(self.height, self.radius)
TMR����