一、类方法像奶茶店长,静态方法像收银机
@classmethod 就像奶茶店的店长,他手里有整个店铺的秘方(类属性),能调配新口味(创建实例)也能调整全店糖量标准(修改类配置):
class MilkTeaShop:
default_sugar = 50 # 全店默认糖量
@classmethod
def create_tea(cls, name):
return cls(name, cls.default_sugar) # 用类属性做奶茶
@staticmethod 则像收银台的计算器,它不关心奶茶配方,只专注算钱(独立功能):
@staticmethod
def calc_price(cups):
return cups * 15 # 每杯15元
二、店长与计算器的核心差异表
三、奶茶分店实战演示
场景1:使用类方法在总店开发新品,然后分店继承配方
class Headquarter:
member_discount = 0.9 # 会员9折
def __init__(self,name,price):
self.name = name
self.price = price
@classmethod
def new_product(cls, name, cost):
# 根据成本定价
price = cost * 2 * cls.member_discount
return cls(name,price)
class SubShop(Headquarter):
member_discount = 0.8 # 分店专属8折
# 使用的是分店折扣
matcha = SubShop.new_product("抹茶奶盖",10)
print(matcha.price)
场景2:使用静态方法计算两杯奶茶的等待时间
class Headquarter:
# ... 原有的代码不变 ...
@staticmethod
def calc_waiting_time(cups, time_per_cup=3):
"""计算多杯奶茶的制作等待时间
:param cups: 订单杯数
:param time_per_cup: 单杯制作时间(默认3分钟)
"""
return cups * time_per_cup
print(Headquarter.calc_waiting_time(2))
print(SubShop.calc_waiting_time(3, time_per_cup=2))
四、新手指南
需要记住店铺秘方时 → 类方法
(例如根据会员等级调整配方)
单纯做数学题时 → 静态方法
(例如计算两杯奶茶的等待时间)
开分店要保持统一标准 → 类方法
(例如所有分店使用相同定价策略)
设计促销活动计算器 → 静态方法
(例如满减优惠计算)
五、常犯错误
错误1:计算器想改配方
@staticmethod
def change_sugar(new_sugar):
default_sugar = new_sugar # 实际创建的是局部变量!
正确做法:交给店长(类方法)处理
错误2:店长忘了带秘方
@classmethod
def show_discount(cls):
print(member_discount) # 正确应为 cls.member_discount
错误3:让计算器管库存
@staticmethod
def check_stock(self): # 不需要self却硬加
return self.remaining_cups > 0
六、动手实验:开一家自己的奶茶店
class MyTeaShop:
# 类属性
base_price = 12
topping_price = {"珍珠":3, "椰果":2}
# 类方法:根据原料定价
@classmethod
def create_menu(cls, tea_type):
return cls.base_price + cls.topping_price.get(tea_type,0)
# 静态方法:打印订单
@staticmethod
def print_order(cups, total):
print(f"您购买了{cups}杯,总计{total}元")
print(MyTeaShop.create_menu("珍珠"))
MyTeaShop.print_order(3, 45)