1. 优先使用函数而非方法
静态方法通常可以直接作为函数存在。对于大多数不使用传入的实例或类的方法来说,同样如此。
换句话说,不要这样写:
from math import isqrt
class Tools:
@staticmethod
def is_prime(n):
if n < 2:
return False
return all(
n % i != 0
for i in range(2, isqrt(n) + 1)
)
最好这样写:
from math import isqrt
def is_prime(n):
if n < 2:
return False
return all(
n % i != 0
for i in range(2, isqrt(n) + 1)
)
采用第一种基于类的方式时,代码的使用者需要这样输入:
>>> Tools.is_prime(7)
True
而不是这样:
>>> is_prime(7)
True
把 is_prime
函数放在类里,既让实现变得复杂,又对代码使用者没有帮助。
要是真觉得有必要把 is_prime
函数放在和模块里其他函数相隔离的命名空间中,那可以单独创建一个模块。毕竟在 Python 里,模块就构成了命名空间,这正是我们需要使用 from math import isqrt
而不是直接 import math
来使用 isqrt(...)
的原因。
所以,优先使用函数而非方法,尤其是当这些方法不需要引用它们所属的类或该类的实例时。
2. 优先使用函数而非类
当你真正需要的只是一个函数时,就不要创建类。
不要这样写类:
from math import isqrt
class Number:
def __init__(self, number):
self.number = number
def is_prime(self):
if self.number < 2:
return False
return all(
self.number % i != 0
for i in range(2, isqrt(self.number) + 1)
)
最好使用这个函数:
from math import isqrt
def is_prime(n):
if n < 2:
return False
return all(
n % i != 0
for i in range(2, isqrt(n) + 1)
)
第一个类的使用方式如下:
>>> Number(7).is_prime()
True
而函数的使用方式是这样:
>>> is_prime(7)
True
即便是使用常规的实例方法而非静态方法,在这里使用类对用户而言也没有太多好处。