11. 静态方法和类方法

之前我们在类中定义的方法都是对象方法。除了对象方法之外,类中还可以有静态方法类方法,这两类方法是发给的消息。在面向对象的世界里,一切皆为对象,我们定义的每一个类其实也是一个对象。

举个例子:定义一个三角形类,通过传入三条边的长度来构造三角形,并提供计算周长和面积的方法。在创建三角形对象时,传入的三条边长未必能构造出三角形,为此我们可以先写一个方法来验证给定的三条边长是否可以构成三角形——这种方法显然是发送给三角形的消息,因为调用时三角形对象还没有创建出来。

python
class Triangle(object):
    """三角形"""

    def __init__(self, a, b, c):
        """初始化方法"""
        self.a = a
        self.b = b
        self.c = c

    @staticmethod
    def is_valid(a, b, c):
        """判断三条边长能否构成三角形(静态方法)"""
        return a + b > c and b + c > a and a + c > b

    # @classmethod
    # def is_valid(cls, a, b, c):
    #     """判断三条边长能否构成三角形(类方法)"""
    #     return a + b > c and b + c > a and a + c > b

    def perimeter(self):
        """计算周长"""
        return self.a + self.b + self.c

    def area(self):
        """计算面积"""
        p = self.perimeter() / 2
        return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5

直接使用 类名.方法名 的方式来调用静态方法和类方法。二者的区别在于:类方法的第一个参数是类对象本身(cls),而静态方法则没有这个参数。

总结:对象方法、类方法、静态方法都可以通过"类名.方法名"的方式来调用,区别在于方法的第一个参数到底是普通对象还是类对象,还是没有接收消息的对象。静态方法通常也可以直接写成一个独立的函数。