Python类设计过程中,遵循DRY原则(Don't Repeat Yourself)是提升代码质量的核心要求,同时兼顾代码执行效率才能让类在实际项目中发挥更好的作用。DRY原则的核心是避免重复代码,将可复用的逻辑集中管理,而高效代码实践则要求类在运行时占用更少资源、执行速度更快。

DRY原则在Python类设计中的实现方法
抽取公共逻辑到基类或工具方法
当多个类存在相同的逻辑时,不要在每个类中重复编写,可以将公共逻辑抽取到基类中,通过继承实现复用。如果逻辑不属于类的核心行为,也可以抽取为独立的工具函数。
例如多个数据模型类都需要对输入数据进行非空校验,就可以将校验逻辑放到基类:
# 基类定义公共校验逻辑
class BaseModel:
def validate_not_empty(self, field_name, value):
if value is None or value == "":
raise ValueError(f"{field_name} 不能为空")
# 用户模型类继承基类,复用校验逻辑
class UserModel(BaseModel):
def __init__(self, name, age):
self.validate_not_empty("name", name)
self.name = name
self.age = age
# 订单模型类同样继承基类,无需重复编写校验代码
class OrderModel(BaseModel):
def __init__(self, order_id, amount):
self.validate_not_empty("order_id", order_id)
self.order_id = order_id
self.amount = amount
使用装饰器复用横切逻辑
对于多个方法中都需要执行的通用逻辑,比如日志记录、权限校验、性能统计等,可以使用装饰器来封装,避免在多个方法中重复编写相同代码。
示例如下:
import time
# 定义统计方法执行时间的装饰器
def time_cost(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行耗时: {end - start:.4f}秒")
return result
return wrapper
class DataProcessor:
@time_cost
def process_user_data(self, data):
# 模拟数据处理逻辑
time.sleep(0.1)
return data
@time_cost
def process_order_data(self, data):
# 模拟数据处理逻辑
time.sleep(0.2)
return data
Python类高效代码实践
合理使用__slots__减少内存占用
默认情况下,Python类的实例会有一个__dict__属性来存储实例变量,这会占用较多内存。如果类的实例属性固定,没有动态添加属性的需求,可以使用__slots__来指定实例允许的属性,避免创建__dict__和__weakref__,大幅减少内存占用。
示例如下:
class NormalUser:
def __init__(self, name, age):
self.name = name
self.age = age
class SlotUser:
__slots__ = ("name", "age")
def __init__(self, name, age):
self.name = name
self.age = age
# 对比内存占用,SlotUser的实例内存占用明显更低
import sys
normal_user = NormalUser("张三", 20)
slot_user = SlotUser("张三", 20)
print(f"普通类实例内存大小: {sys.getsizeof(normal_user.__dict__)}")
print(f"使用__slots__的实例内存大小: {sys.getsizeof(slot_user)}")
延迟计算属性提升运行效率
对于计算成本较高、且可能不会每次都被访问的属性,可以使用property结合缓存实现延迟计算,避免初始化时就执行高成本计算,只有当属性第一次被访问时才计算并缓存结果。
示例如下:
class DataAnalyzer:
def __init__(self, raw_data):
self.raw_data = raw_data
self._processed_data = None
@property
def processed_data(self):
# 第一次访问时才处理数据,后续直接返回缓存结果
if self._processed_data is None:
print("开始处理数据...")
# 模拟高成本的数据处理逻辑
self._processed_data = [x * 2 for x in self.raw_data]
return self._processed_data
analyzer = DataAnalyzer([1,2,3,4])
# 第一次访问,触发计算
print(analyzer.processed_data)
# 第二次访问,直接返回缓存结果,不会重复计算
print(analyzer.processed_data)
实践注意事项
在应用DRY原则时,要避免过度抽象,不要为了复用而强行将不相关的逻辑放在一起,否则会导致代码可读性下降。对于高效代码实践,需要结合实际场景选择方案,比如__slots__只适合属性固定的类,动态添加属性的场景不能使用。
合理的类设计需要平衡复用性、可读性和执行效率,在减少冗余代码的同时,保证类的逻辑清晰,符合项目的实际需求。