13.8 静态方法和类方法

静态方法和类方法在Python 2.2中被引入。经典类及新式(new-style)类中都可以使用它。一对内建函数被引入,用于将作为类定义的一部分的某一方法声明“标记”(tag), “强制类型转换”(cast)或者”转换”(convert)为这两种类型的方法之一。

如果你有一定的C++或者Java经验,静态方法和这些语言中的是一样的。它们仅是类中的函数(不需要实例)。事实上,在静态方法加入到Python之前,用户只能在全局名字空间中创建函数,作为这种特性的替代实现——有时在这样的函数中使用类对象来操作类(或者是类属性)。使用模块函数比使用静态类方法更加常见。

回忆一下,通常的方法需要一个实例(self)作为第一个参数,并且对于(绑定的)方法调用来说,self是自动传递给这个方法的。而对于类方法而言,需要类而不是实例作为第一个参数,它是由解释器传给方法。类不需要特别地命名,类似self,不过很多人使用cls作为变量名字。

13.8.1 staticmethod()和classmethod()内建函数

现在让我们看一下在经典类中创建静态方法和类方法的一些例子(你也可以把它们用在新式类中):

13.8 静态方法和类方法 - 图1

对应的内建函数被转换成它们相应的类型,并且重新赋值给了相同的变量名。如果没有调用这两个函数,二者都会在Python编译器中产生错误,显示需要带self的常规方法声明。现在,我们可以通过类或者实例调用这些函数,这没什么不同:

13.8 静态方法和类方法 - 图2

13.8.2 使用函数修饰符

现在,看到像foo=staticmethod(foo)这样的代码会刺激一些程序员。很多人对这样一个没意义的语法感到心烦,即使van Rossum曾指出过,它只是临时的,有待社区对些语义进行处理。在第11章的11.3.6节中,我们了解了函数修饰符,一种在Python2.4中加入的新特征。你可以用它把一个函数应用到另个函数对象上,而且新函数对象依然绑定在原来的变量。我们正是需要它来整理语法。通过使用解构器,我们可以避免像上面那样的重新赋值:

13.8 静态方法和类方法 - 图3