跳到主要内容

9.1 类与对象

面向对象是编程的一种组织方式。新手第一次接触会觉得抽象,我们从一个比喻开始,慢慢来。

类和对象是什么

  • 类(class):图纸、模板。比如"猫"这个概念:有名字、有年龄、会叫。
  • 对象(object):按图纸造出来的具体东西。比如你家那只 3 岁的"咪咪"。

一张图纸能造无数个对象,每个对象各有各的数据。

其实你早就在用对象了:字符串就是 str 类的对象,"abc".upper() 就是在调用对象的方法。

定义一个类

class Cat:
"""猫类"""

def __init__(self, name, age):
self.name = name # 属性:这只猫的名字
self.age = age # 属性:这只猫的年龄

def meow(self): # 方法:这只猫会做的事
print(f"{self.name}:喵喵喵~")

def introduce(self):
print(f"我叫{self.name},今年{self.age}岁")

逐个解释这些新面孔:

  • class Cat: 定义一个类。类名习惯用大写字母开头
  • __init__初始化方法(注意前后各两条下划线):创建对象时自动执行,负责给对象装上初始数据。
  • self 代表对象自己self.name = name 的意思是"把传进来的 name 存到这只猫自己身上"。
  • 类里的函数叫方法,第一个参数必须写 self

创建和使用对象

# 创建对象(不用写 self,Python 自动传)
cat1 = Cat("咪咪", 3)
cat2 = Cat("大橘", 5)

# 访问属性
print(cat1.name) # 咪咪
print(cat2.name) # 大橘(两个对象的数据互相独立)

# 调用方法
cat1.meow() # 咪咪:喵喵喵~
cat2.introduce() # 我叫大橘,今年5岁

# 修改属性
cat1.age = 4
print(cat1.age) # 4

Cat("咪咪", 3) 发生了什么:Python 创建一个新对象 → 自动调用 __init__(self, "咪咪", 3)self 就是这个新对象 → 名字年龄被装到对象上。

关于 self 的两个规矩

  1. 定义方法时,第一个参数写 self(忘写会报错 takes 0 positional arguments but 1 was given——超高频报错!)
  2. 调用方法时,不传 self,Python 自动把对象自己传进去
class Dog:
def bark(): # ❌ 忘了 self
print("汪汪")

d = Dog()
d.bark() # TypeError: bark() takes 0 positional arguments but 1 was given

一个更实用的例子:银行账户

class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance

def deposit(self, amount):
"""存钱"""
if amount <= 0:
print("金额必须大于 0")
return
self.balance += amount
print(f"存入 {amount} 元,余额 {self.balance} 元")

def withdraw(self, amount):
"""取钱"""
if amount > self.balance:
print("余额不足!")
return
self.balance -= amount
print(f"取出 {amount} 元,余额 {self.balance} 元")


account = BankAccount("小明", 100)
account.deposit(50) # 存入 50 元,余额 150 元
account.withdraw(200) # 余额不足!
account.withdraw(30) # 取出 30 元,余额 120 元

体会一下面向对象的好处:数据(balance)和操作数据的行为(存、取)打包在一起,外部只需调用方法,不用关心内部细节。

什么时候需要写类

新手常问"函数就够用了,为啥要类?"经验法则:

  • 简单脚本、一次性任务 → 函数就够了
  • 有一"类"东西,既有数据又有行为,还要创建多个 → 用类(如游戏里的多个角色、系统里的多个账户)

不必强行处处用类,够用就好。

练习

  1. 定义 Student 类:属性有姓名、成绩;方法 show() 打印"xx 的成绩是 xx 分"。创建两个学生对象并调用。
  2. Student 加一个方法 is_pass(),成绩 >= 60 返回 True,否则 False。
  3. (挑战)写一个 Counter 计数器类:有 count 属性(初始 0)、add() 方法(加 1)、reset() 方法(归零)。
点击查看答案
class Student:
def __init__(self, name, score):
self.name = name
self.score = score

def show(self):
print(f"{self.name} 的成绩是 {self.score} 分")

def is_pass(self):
return self.score >= 60


s1 = Student("小明", 90)
s2 = Student("小刚", 55)
s1.show()
print(s2.is_pass()) # False


class Counter:
def __init__(self):
self.count = 0

def add(self):
self.count += 1

def reset(self):
self.count = 0


c = Counter()
c.add()
c.add()
print(c.count) # 2
c.reset()
print(c.count) # 0

本章小结

  • 类是模板,对象是按模板创建的具体实例
  • __init__ 初始化对象数据,self 代表对象自己
  • 定义方法必须带 self,调用时不传
  • 类 = 数据 + 行为的打包

下一节:9.2 继承