到底什么是"对象"?(别慌!真没你想的复杂)
很多小白看到"对象"两个字就腿软,以为要搞什么高深莫测的玄学。其实你每天都在用对象!比如刷朋友圈时看到的每一条动态,就是微信动态类的对象;点外卖时看到的每家店铺,都是商家类的对象(没想到吧!)
举个真实案例:你正在玩的王者荣耀,每个英雄都是对象。后羿的皮肤是它的属性,大招是它的方法。当你的后羿释放大招时,本质上就是在调用对象的方法!(现在是不是觉得对象突然亲切了?)
类与对象的关系(比情侣关系还紧密)
想象你要开奶茶店(类),这个店需要有:
- 基础配方(属性)
- 制作流程(方法)
- 原料配比(参数)
当顾客下单时(实例化),就会根据这个类创建出:
- 珍珠奶茶(对象)
- 布丁奶茶(对象)
- 芋泥波波(对象)
看代码更直观👇
class MilkTea:
# 魔法方法:对象出生时的身份证
def __init__(self, name, sugar_level):
self.name = name # 奶茶名称
self.sugar = sugar_level # 甜度等级
self.toppings = [] # 加料列表
# 方法:加料操作
def add_topping(self, topping):
print(f"正在给{self.name}加{topping}...")
self.toppings.append(topping)
# 方法:显示详情
def show_info(self):
print(f"【{self.name}】甜度:{self.sugar} 加料:{self.toppings}")
# 实例化对象(点单啦!)
order1 = MilkTea("珍珠奶茶", "半糖")
order1.add_topping("波霸")
order1.add_topping("椰果")
order1.show_info()
# 输出结果:
# 正在给珍珠奶茶加波霸...
# 正在给珍珠奶茶加椰果...
# 【珍珠奶茶】甜度:半糖 加料:['波霸', '椰果']
(重要提示)这里有几个容易掉坑的点:
self不是关键字!换成this或it也行(但别作死)- 类名要用大驼峰命名(比如
MilkTea而不是milk_tea) - 双下划线
__开头的方法是Python的魔法方法(比如__init__)
面向对象三大特征(这才是精华!)
1. 封装:给你的代码穿秋裤
把数据和方法打包成一个整体,外部只能通过指定方式访问。就像自动贩卖机——你不需要知道内部构造,只要会按按钮就行。
class ATM:
def __init__(self):
self.__password = "123456" # 私有属性(双下划线开头)
def withdraw(self, amount):
self.__check_balance()
print(f"取出{amount}元")
def __check_balance(self): # 私有方法
print("余额充足,请放心取款")
# 使用时
atm = ATM()
atm.withdraw(500) # ✔️ 正确方式
# atm.__check_balance() ❌ 会报错!
(划重点)封装的好处:
- 防止数据被意外修改
- 隐藏实现细节
- 提高代码可维护性
2. 继承:白嫖代码最快乐
就像儿子继承父亲的财产,子类可以继承父类的属性和方法。来看王者荣耀的英雄继承体系:
class Hero:
def __init__(self, name, hp):
self.name = name
self.hp = hp
def attack(self):
print("普通攻击!")
class Archer(Hero): # 继承Hero类
def skill(self):
print("释放箭雨!")
class Mage(Hero):
def skill(self):
print("召唤陨石!")
# 创建后羿对象
houyi = Archer("后羿", 3000)
houyi.attack() # 继承自父类
houyi.skill() # 自己的技能
3. 多态:同一个方法不同效果
同一个方法在不同子类中有不同实现,就像不同英雄的大招效果不同:
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("汪汪汪!")
class Cat(Animal):
def speak(self):
print("喵喵喵~")
def make_sound(animal):
animal.speak()
# 测试
make_sound(Dog()) # 汪汪汪!
make_sound(Cat()) # 喵喵喵~
(注意)Python天生支持多态,不需要像Java那样用接口实现
什么时候该用面向对象?(别乱用!)
适合场景:
- 开发大型项目(超过500行代码)
- 需要高度复用的功能模块
- 处理复杂数据关系
- 需要多人协作开发
不适合场景:
- 写简单脚本(比如自动重命名文件)
- 处理一次性任务
- 性能要求极高的程序
常见翻车现场(血泪教训)
1. 滥用继承导致类爆炸
新手最爱写Animal -> Dog -> Teddy -> MyTeddy这种无限继承链。正确做法是优先使用组合而不是继承!
2. 把类写成万能工具箱
一个类不要超过500行代码,遵循单一职责原则。比如把User类拆分成:
UserInfo(基本信息)UserAuth(认证相关)UserProfile(个人资料)
3. 过度设计玩架构
还没开始写代码,先画十几层类图。记住:先让程序跑起来,再考虑优化!
高阶技巧(装X必备)
1. 类属性 vs 实例属性
class Website:
# 类属性(所有对象共享)
domain = "com"
def __init__(self, name):
# 实例属性(每个对象独有)
self.name = name
# 修改类属性会影响所有实例
Website.domain = "cn"
2. 静态方法 vs 类方法
class DateUtils:
@staticmethod
def is_weekend(date):
# 静态方法不需要self/cls
return date.weekday() > 4
@classmethod
def from_string(cls, date_str):
# 类方法第一个参数是cls
return cls(date_str)
3. 属性装饰器
class Student:
def __init__(self):
self._score = 0
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if 0 <= value <= 100:
self._score = value
else:
raise ValueError("分数必须在0-100之间")
# 使用
s = Student()
s.score = 90 # 自动调用setter
print(s.score) # 自动调用getter
最后说点人话
面向对象不是银弹,但绝对是大型项目的必备技能。刚开始可能会觉得"脱裤子放屁",等遇到几百个函数互相调用时,你就会哭着说"真香"!
记住面向对象的核心思想:把大象装冰箱总共分三步:
- 定义冰箱类
- 创建大象对象
- 调用装大象的方法
(别打我,这个例子虽然烂,但确实好记啊!)
1379

被折叠的 条评论
为什么被折叠?



