你好呀,Python爱好者!👋
今天我们来聊一个让无数新手“又爱又恨”的话题——类(Class) 和对象(Object)。有人说它们是Python的灵魂,也有人觉得像“天书”… 别慌!这篇用奶茶店点单作比喻,带你轻松吃透核心概念!☕️
一、类和对象是什么?
想象你要开一家奶茶店,店里要有员工、菜单、操作流程。这时候你需要先画一张设计图,写清楚:
• 奶茶配方(属性)
• 制作步骤(方法)
这就是类(Class)——它就像奶茶店的设计蓝图!
当你按照设计图做出第一杯奶茶时,这杯具体的奶茶就是对象(Object)。你可以做100杯不同口味的奶茶,但它们都来自同一张配方表!
代码示例:
class MilkTea: # 类:奶茶设计图
category = "芝士奶盖" # 类属性(所有奶茶都有这个分类)
def __init__(self, sugar, topping):
self.sugar = sugar # 实例属性:糖度
self.topping = topping # 实例属性:加料
# 创建两杯奶茶对象
order1 = MilkTea("半糖", "珍珠")
order2 = MilkTea("无糖", "椰果")
二、类 vs 对象的三大秘密
1️⃣ 类属性 vs 实例属性
• 类属性:所有奶茶共享的特征(比如所有芝士奶盖系列都默认有奶盖)
• 实例属性:每杯奶茶独有的特征(糖度、加料不同)
举个栗子🌰:
print(order1.category) # 输出:芝士奶盖(类属性)
print(order1.sugar) # 输出:半糖(实例属性)
2️⃣ 方法:让对象动起来!
• 实例方法:操作具体奶茶的方法(如搅拌、加冰)
def add_ice(self):
print(f"{self.topping}奶茶加冰完成!🧊")
order1.add_ice() # 输出:珍珠奶茶加冰完成!
• 类方法:管理整个奶茶品类
@classmethod
def change_category(cls, new_category):
cls.category = new_category
MilkTea.change_category("水果茶")
print(order2.category) # 输出:水果茶(所有实例同步修改!)
以上代码需要组合成一个整体,请看文末完整代码。
三、进阶技巧:继承与多态
1️⃣ 继承:开一家分店
假设你要开一家水果茶分店,可以直接复用奶茶店的模板,再增加新功能:
class FruitTea(MilkTea): # 继承自MilkTea
def __init__(self, sugar, fruit_type):
super().__init__(sugar, topping=None) # 调用父类方法
self.fruit = fruit_type # 新增属性
# 创建一杯芒果冰沙
order3 = FruitTea("全糖", "芒果")
2️⃣ 多态:万物皆可“做奶茶”
无论基础奶茶还是水果茶,只要实现make()
方法,就能统一调用:
def factory(tea_type):
tea_type.make()
# 假设MilkTea和FruitTea都有make()方法
factory(order1) # 制作芝士奶盖
factory(order3) # 制作芒果冰沙
四、封装:保护你的秘方
奶茶店的秘方不能随便改!Python用“下划线”实现伪私有:
• _secret
:暗示“不要随便碰”(但强行改也行)
• __recipe
:自动变形成_MilkTea__recipe
(增加修改难度)
代码示例:
class MilkTea:
def __init__(self):
self._price = 20 # 建议不要直接修改
self.__recipe = "秘方" # 私有属性
order = MilkTea()
print(order._price) # 20(不推荐)
print(order._MilkTea__recipe) # 秘方(强制访问)
五、一句话总结
类 = 设计图,对象 = 实物
属性 = 特征,方法 = 行为
继承 = 子承父业,封装 = 保护隐私
# 完整代码
class MilkTea: # 类:奶茶设计图
category = "芝士奶盖" # 类属性(所有奶茶都有这个分类)
def __init__(self, sugar, topping):
self.sugar = sugar # 实例属性:糖度
self.topping = topping # 实例属性:加料
def add_ice(self):
print(f"{self.topping}奶茶加冰完成!🧊")
@classmethod
def change_category(cls, new_category):
cls.category = new_category
# 创建两杯奶茶对象
order1 = MilkTea("半糖", "珍珠")
order2 = MilkTea("无糖", "椰果")
# 调用属性
print(order1.category) # 输出:芝士奶盖
print(order2.category) # 输出:芝士奶盖
print(order1.sugar) # 输出:半糖
print(order1.topping) # 输出:珍珠
print(order2.sugar) # 输出:无糖
print(order2.topping) # 输出:椰果
order1.add_ice() # 输出:珍珠奶茶加冰完成!
MilkTea.change_category("水果茶")
print(order2.category) # 输出:水果茶(所有实例同步修改!)
class FruitTea(MilkTea): # 继承自MilkTea
def __init__(self, sugar, fruit_type):
super().__init__(sugar, topping=None) # 调用父类方法
self.fruit = fruit_type # 新增属性
# 创建一杯芒果冰沙
order3 = FruitTea("全糖", "芒果")
💡 动手时间:
试着用类模拟一个「咖啡店订单系统」,包含:
-
咖啡品类(美式、拿铁)
-
自定义糖度、温度
-
计算总价的方法
私信我,获取「咖啡店订单系统」代码。