一篇文章搞懂Python类和对象(从入门到入土版)

到底什么是"对象"?(别慌!真没你想的复杂)

很多小白看到"对象"两个字就腿软,以为要搞什么高深莫测的玄学。其实你每天都在用对象!比如刷朋友圈时看到的每一条动态,就是微信动态类的对象;点外卖时看到的每家店铺,都是商家类的对象(没想到吧!)

举个真实案例:你正在玩的王者荣耀,每个英雄都是对象。后羿的皮肤是它的属性,大招是它的方法。当你的后羿释放大招时,本质上就是在调用对象的方法!(现在是不是觉得对象突然亲切了?)

类与对象的关系(比情侣关系还紧密)

想象你要开奶茶店(类),这个店需要有:

  • 基础配方(属性)
  • 制作流程(方法)
  • 原料配比(参数)

当顾客下单时(实例化),就会根据这个类创建出:

  • 珍珠奶茶(对象)
  • 布丁奶茶(对象)
  • 芋泥波波(对象)

看代码更直观👇

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()

# 输出结果:
# 正在给珍珠奶茶加波霸...
# 正在给珍珠奶茶加椰果...
# 【珍珠奶茶】甜度:半糖 加料:['波霸', '椰果']

(重要提示)这里有几个容易掉坑的点:

  1. self不是关键字!换成thisit也行(但别作死)
  2. 类名要用大驼峰命名(比如MilkTea而不是milk_tea
  3. 双下划线__开头的方法是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那样用接口实现

什么时候该用面向对象?(别乱用!)

适合场景:

  1. 开发大型项目(超过500行代码)
  2. 需要高度复用的功能模块
  3. 处理复杂数据关系
  4. 需要多人协作开发

不适合场景:

  1. 写简单脚本(比如自动重命名文件)
  2. 处理一次性任务
  3. 性能要求极高的程序

常见翻车现场(血泪教训)

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

最后说点人话

面向对象不是银弹,但绝对是大型项目的必备技能。刚开始可能会觉得"脱裤子放屁",等遇到几百个函数互相调用时,你就会哭着说"真香"!

记住面向对象的核心思想:把大象装冰箱总共分三步:

  1. 定义冰箱类
  2. 创建大象对象
  3. 调用装大象的方法

(别打我,这个例子虽然烂,但确实好记啊!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值