类的方法概览
首先回顾一下 Python OOP 常见的三种方法:
- instance method 实例 / 接口方法
- class method 类方法
- static method 静态方法
标准书写方式如下:
class MyClass:
def method(self):
return 'instance method called', self
@classmethod
def classmethod(cls):
return 'class method called', cls
@staticmethod
def staticmethod():
return 'static method called'
我们最常用的其实就是普通的接口方法,其他两个需要用类似装饰器的写法来标注。
类方法接受一个 cls 作为参数,它是指向 MyClass 本身的,并不是 MyClass 所创建的实例。
静态方法不接受 self 或者 cls 作为参数,所以不会修改类本身或者实例
类方法示例
看一下如何使用类方法,新建一个 Pizza 类,主要参数为原料 ingredients
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients !r})'
新建一个实例测试一下:
Pizza(['cheese', 'tomatoes'])
Out: Pizza(['cheese', 'tomatoes'])
测试成功。
现在问题来了,既然是 Pizza 类,会有不同口味的 Pizza,他们的配方都是固定的,那么如何便捷的生成不同口味的 Pizza 呢,答案就是 classmethod
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
def __repr__(self):
return f'Pizza({self.ingredients!r})'
@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomatoes'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
类方法可以根据需求事先预定义生成的实例,减少了代码量,这里我们根据 margherita 和 prosciutto 两种口味 pizza 的原料提前准备好了,cls 就是代表类本身,这样如果我们再生成一些实例时,会方便很多:
# 生成一个 margherita 口味的 pizza
m = Pizza.margherita()
m
Out:Pizza(['mozzarella', 'tomatoes'])
# 生成一个 prosciutto 口味的 pizza
p = Pizza.prosciutto()
p
Out:Pizza(['mozzarella', 'tomatoes', 'ham'])
静态方法示例
那么什么时候用静态方法呢? 比如还用这个例子,我想计算 pizza 的面积:
import math
class Pizza:
def __init__(self, radius, ingredients):
self.radius = radius
self.ingredients = ingredients
def __repr__(self):
return (f'Pizza({self.radius!r},'
f'{self.ingredients!r})')
def area(self):
return self.circle_area(self.radius)
@staticmethod
def circle_area(r):
return r ** 2 * math.pi
这种情况下使用一个静态方法是一个好的选择,通过 area 这个普通的接口方法,可以调用 circle_area 来计算面积,封装性更好:
p = Pizza(4, ['mozzarella', 'tomatoes'])
p.area()
Out: 50.26548245743669
总结
这次简单总结了类中的三种方法,通过 Pizza 类的实例方便理解,如果大家有想和我沟通交流的,欢迎留言,或者点击以下链接访问我的网站:
- 我的 Github 静态博客
谢谢阅读