类与对象
本节目标
学完这一节,你会知道:
- 类和对象分别是什么
- 如何用
class定义自己的类型 __init__用来做什么self为什么总是出现- 如何把数据和操作放到同一个对象里
面向对象不是一开始就必须用,但当数据和操作越来越多时,它能让代码更好组织。
先跑一个例子
新建文件 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 是类。
student1 和 student2 是对象,也叫实例。
如果把类比作“学生信息卡模板”,对象就是“小明的信息卡”“小红的信息卡”。
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)
name 和 score 就是对象的属性。
也可以修改属性:
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.name、self.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()
然后继续改:
- 增加属性
level - 增加方法
is_beginner(),判断课程是否适合零基础 - 创建两个不同课程对象
实战:学生成绩类
新建文件 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)
小结
这一节你学会了:
- 类是模板,对象是根据模板创建出来的实例
__init__用来初始化对象- 属性保存对象的数据
- 方法表示对象能做的事
self代表当前对象自己
下一节我们会学习继承与多态。它能让新类复用已有类的代码。
类和对象没那么玄,它就是数据卡片会做事
把学生的名字、成绩和报告方法放在一起,你就摸到面向对象的门把手了。self 一开始看着像突然冒出来的人名,其实它就是当前对象自己。马哥建议你先写小类,别一上来就造宇宙。
我已经学到面向对象啦~~