7.4 类方法

类方法是直接绑定到类而非它的实例的方法:

>>> class Pizza(object):
...   radius = 42
...   @classmethod
...   def get_radius(cls):
...     return cls.radius
...
>>> Pizza.get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza().get_radius
<bound method type.get_radius of <class '__main__.Pizza'>>
>>> Pizza.get_radius is Pizza().get_radius
True
>>> Pizza.get_radius()
42

然而,如果选择访问这个方法,它总是会被绑定在它所附着的类上,而且它的第一个参数将是类本身。(记住,类也是对象。)

广告:个人专属 VPN,独立 IP,流量大,速度快,连接稳定,多机房切换,每月最低仅 10 美元

类方法对于创建工厂方法最有用,即以特定方式实例化对象。如果用@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())

在这个例子中,提供了工厂方法from_fridge,可以传入一个Fridge对象。如果像Pizza.from_fridge(myfridge)这样调用这个方法,它会返回一个根据myfridge中可用的材料做成的全新Pizza