静态方法

静态方法

静态方法是一类特殊的方法。有时,需要写属于一个类的方法,但是不需要用到对象本身。例如:

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����

你可能感兴趣的:(静态方法)