第七章 · 面向对象

类与对象

本节目标

学完这一节,你会知道:

  1. 类和对象分别是什么
  2. 如何用 class 定义自己的类型
  3. __init__ 用来做什么
  4. self 为什么总是出现
  5. 如何把数据和操作放到同一个对象里

面向对象不是一开始就必须用,但当数据和操作越来越多时,它能让代码更好组织。

先跑一个例子

新建文件 class_demo.py,写入:

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def show_info(self):
        print(f"姓名:{self.name},成绩:{self.score}")


student = Student("小明", 85)
student.show_info()

运行:

python3 class_demo.py

你会看到:

姓名:小明,成绩:85

Student 是类,student 是根据类创建出来的对象。

什么是类和对象?

类像一张设计图,对象是根据设计图造出来的具体东西。

class Student:
    pass


student1 = Student()
student2 = Student()

Student 是类。

student1student2 是对象,也叫实例。

如果把类比作“学生信息卡模板”,对象就是“小明的信息卡”“小红的信息卡”。

init:初始化对象

创建对象时,Python 会自动调用 __init__()

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

调用:

student = Student("小明", 85)

这会把 "小明" 保存到 student.name,把 85 保存到 student.score

属性:对象保存的数据

student = Student("小明", 85)

print(student.name)
print(student.score)

namescore 就是对象的属性。

也可以修改属性:

student.score = 92
print(student.score)

方法:对象能做的事

写在类里面的函数叫方法。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

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

调用:

student = Student("小明", 85)
print(student.is_passed())

方法可以使用对象自己的属性。

self 是什么?

self 代表当前对象自己。

def show_info(self):
    print(self.name)

当你调用:

student.show_info()

Python 会自动把 student 传给 self

所以在类的方法里,要通过 self.nameself.score 访问当前对象的数据。

类属性和实例属性

实例属性:每个对象自己有一份。

self.name = name

类属性:所有对象共享。

class Student:
    school = "马哥的python小屋"

使用:

student = Student("小明", 85)
print(student.school)

刚入门时,最常用的是实例属性。

逐行拆解

再看开头的例子:

class Student:

定义一个类,名字叫 Student

def __init__(self, name, score):

创建对象时自动执行,用来初始化数据。

self.name = name

把传入的 name 保存到当前对象。

student = Student("小明", 85)

创建一个学生对象。

自己改一改

class_demo.py 改成:

class Course:
    def __init__(self, title, teacher, lessons):
        self.title = title
        self.teacher = teacher
        self.lessons = lessons

    def show_info(self):
        print(f"课程:{self.title}")
        print(f"老师:{self.teacher}")
        print(f"课时:{self.lessons}")


course = Course("Python 入门", "马哥", 25)
course.show_info()

然后继续改:

  1. 增加属性 level
  2. 增加方法 is_beginner(),判断课程是否适合零基础
  3. 创建两个不同课程对象

实战:学生成绩类

新建文件 student_report.py

class Student:
    def __init__(self, name, scores):
        self.name = name
        self.scores = scores

    def average(self):
        return sum(self.scores) / len(self.scores)

    def grade(self):
        avg = self.average()
        if avg >= 90:
            return "A"
        elif avg >= 80:
            return "B"
        elif avg >= 60:
            return "及格"
        else:
            return "不及格"

    def report(self):
        print(f"姓名:{self.name}")
        print(f"成绩:{self.scores}")
        print(f"平均分:{self.average():.1f}")
        print(f"等级:{self.grade()}")


student = Student("小明", [85, 92, 78])
student.report()

这个类把学生数据和成绩相关操作放在了一起。

常见错误

1. 忘记 self

错误写法:

class Student:
    def show_info():
        print("hello")

方法通常要写 self

def show_info(self):
    print("hello")

2. 忘记使用 self 保存属性

错误写法:

def __init__(self, name):
    name = name

正确写法:

def __init__(self, name):
    self.name = name

3. 类名和变量名混乱

类名通常用大驼峰:

class StudentReport:
    pass

变量名通常小写加下划线:

student_report = StudentReport()

4. 一开始就把类写得太复杂

先从“属性 + 少量方法”开始。等逻辑变复杂,再继续拆分。

小练习

练习 1:创建 Book 类

定义 Book 类,包含标题、作者、价格,并写一个 show_info() 方法。

练习 2:创建 Rectangle 类

定义 Rectangle 类,包含宽和高,写一个 area() 方法返回面积。

练习 3:创建 User 类

定义 User 类,包含用户名和是否激活,写一个 deactivate() 方法把用户设为未激活。

参考答案

练习 1:

class Book:
    def __init__(self, title, author, price):
        self.title = title
        self.author = author
        self.price = price

    def show_info(self):
        print(f"{self.title},作者:{self.author},价格:{self.price}")

练习 2:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


rect = Rectangle(3, 5)
print(rect.area())

练习 3:

class User:
    def __init__(self, username):
        self.username = username
        self.is_active = True

    def deactivate(self):
        self.is_active = False


user = User("mage")
user.deactivate()
print(user.is_active)

小结

这一节你学会了:

  1. 类是模板,对象是根据模板创建出来的实例
  2. __init__ 用来初始化对象
  3. 属性保存对象的数据
  4. 方法表示对象能做的事
  5. self 代表当前对象自己

下一节我们会学习继承与多态。它能让新类复用已有类的代码。

类和对象没那么玄,它就是数据卡片会做事

把学生的名字、成绩和报告方法放在一起,你就摸到面向对象的门把手了。self 一开始看着像突然冒出来的人名,其实它就是当前对象自己。马哥建议你先写小类,别一上来就造宇宙。

讨论 (1)

493882434@qq.com 的头像
493882434@qq.com

我已经学到面向对象啦~~