GXB's Blog

  • 首页
  • 学习笔记
    • C++
    • golang
    • javascript
    • python
  • 工具分享
  • 其它
Kratos
专注于用户阅读体验的响应式博客主题
  1. 首页
  2. 学习笔记
  3. python
  4. 正文

Python 类与继承:从入门到核心思想

2026年5月7日 2点热度 0人点赞 0条评论

如果你是 Python 初学者,可能已经习惯了函数和列表这种“直来直往”的编程方式。但随着代码量增长,你会发现一种更强大、更优雅的组织代码的方式——面向对象编程(OOP)。

而类和继承,正是 OOP 的两块基石。今天这篇文章,我们就来彻底搞懂它们是什么,以及为什么需要它们。

一、为什么需要类?

先想想现实世界。你描述一辆车,不会说“一块铁皮、四个圆形的橡胶物体、一块玻璃……”,你会说“一辆车”。车是一个概念,它包含了属性(颜色、品牌、排量)和行为(加速、刹车、鸣笛)。

编程时也一样。如果你要处理多个学生的成绩,可能会用字典:

python
student1 = {“name”: “张三”, “score”: 85}
student2 = {“name”: “李四”, “score”: 92}
这样写几个还行,但当你需要给每个学生增加方法(比如计算评级、修改分数)时,散落的函数和字典就会变得混乱。

类(Class) 就是用来解决这个问题的。它允许你自定义一种新的数据类型,把相关的数据和操作它的函数打包在一起。

二、类的定义与实例化

先看一个最简单的类:

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

def get_grade(self):
if self.score >= 90:
return “A”
elif self.score >= 70:
return “B”
else:
return “C”

  • class Student::定义一个名为 Student 的类。
  • __init__(self, name, score):这是**构造方法**,在创建对象时自动调用。self 指代正在创建的那个对象本身,它必须作为第一个参数。
  • self.name = name:给对象添加属性,把传入的参数存到对象内部。
  • get_grade(self):这是一个**实例方法**,专门用来操作当前对象的数据。

创建和使用对象(即类的实例):

python
s1 = Student(“张三”, 85)
s2 = Student(“李四”, 92)

print(s1.name) # 输出:张三
print(s2.get_grade()) # 输出:A
s1 和 s2 是两个独立的实例,各自拥有自己的 name 和 score,互不干扰。

三、类属性 vs 实例属性

理解这个概念很重要。

  • 实例属性:每个对象自己独有的。比如每个学生的名字不同,通过 self.xxx = xxx 在 __init__ 中定义。
  • 类属性:属于类本身,所有实例共享同一个值。比如我们记录一共创建了多少个学生对象。

示例:

python
class Student:
total_students = 0 # 类属性

def __init__(self, name, score):
self.name = name # 实例属性
self.score = score # 实例属性
Student.total_students += 1

print(Student.total_students) # 0
s1 = Student(“张三”, 85)
s2 = Student(“李四”, 92)
print(Student.total_students) # 2
四、什么是继承?

继承是面向对象编程的三大特性(封装、继承、多态)之一。

一句话定义:子类可以复用和扩展父类的属性和方法。

假设你已经有了一个 Student 类,现在你想描述大学生 CollegeStudent。大学生也是学生,拥有学生的一切(姓名、成绩、评级),但多了一些新特性(专业、选课)。你没必要重新写一遍所有代码,只需要让 CollegeStudent 继承 Student 即可。

五、如何实现继承

python
class CollegeStudent(Student): # 括号里写父类名
def __init__(self, name, score, major):
super().__init__(name, score) # 调用父类的构造方法
self.major = major # 新增的属性

def get_intro(self):
return f“我是{self.name},专业是{self.major}”
关键点:

  • class CollegeStudent(Student): 表示 CollegeStudent 继承自 Student。
  • super().__init__(name, score):super() 让你调用父类的方法。这里调用了父类的 __init__,避免重复初始化 name 和 score。
  • 子类可以新增自己的属性和方法(如 major 和 get_intro)。

使用子类:

python
c1 = CollegeStudent(“王五”, 88, “计算机科学”)
print(c1.name) # 继承自父类:王五
print(c1.get_grade()) # 继承自父类:B
print(c1.major) # 子类自己的:计算机科学
print(c1.get_intro()) # 子类自己的:我是王五,专业是计算机科学
六、方法重写(Override)

如果子类对父类的某个方法不满意,可以重新实现它:

python
class CollegeStudent(Student):
# ... 省略 __init__ ...
def get_grade(self):
# 大学生评级更严格一些
if self.score >= 95:
return “A+”
elif self.score >= 85:
return “A”
elif self.score >= 70:
return “B”
else:
return “C”

c1 = CollegeStudent(“王五”, 88, “计算机科学”)
print(c1.get_grade()) # 输出:A(而不是父类里的B)
此时,CollegeStudent 的 get_grade 完全覆盖了父类的方法。但你仍然可以通过 super().get_grade() 在子类方法内部调用父类的版本。

七、多重继承(小心使用)

Python 支持一个子类继承多个父类:

python
class A:
def foo(self):
print(“A’s foo”)

class B:
def bar(self):
print(“B’s bar”)

class C(A, B):
pass

obj = C()
obj.foo() # A's foo
obj.bar() # B's bar
多重继承很强大,但容易带来复杂性(比如两个父类有同名方法时,方法解析顺序 MRO 的问题)。建议只在必要时使用,尽量保持继承链简单清晰。

八、什么时候应该用继承?

继承不是万能的,滥用继承会让代码僵化。遵循两个原则:

  1. “is-a”关系:仅在子类“是一种”父类时使用继承。例如 CollegeStudent 是一种 Student。如果只是需要复用一些工具函数,用组合(把别的类的实例作为自己的属性)比继承更灵活。
  2. 层次不要太深:超过三层的继承体系往往难以理解和维护。优先考虑组合或接口式的抽象基类(ABC)。

九、几个实用的内置方法和属性

Python 的类提供了一些好用的内置工具:

  • isinstance(obj, Class):判断一个对象是不是某个类(或其子类)的实例。
  • issubclass(Sub, Parent):判断一个类是不是另一个类的子类。
  • __str__:定义打印对象时的显示内容。例如:
    def __str__(self): return f“{self.name}: {self.score}分”
  • @classmethod 和 @staticmethod:定义属于类而不是实例的方法,常用于工厂模式或工具函数。

十、一个综合示例:从父类到子类的完整实践

python
class Animal:
def __init__(self, name):
self.name = name

def speak(self):
raise NotImplementedError(“子类必须实现此方法”)

def __str__(self):
return f“动物:{self.name}”

class Dog(Animal):
def speak(self):
return f“{self.name} 汪汪叫”

def wag_tail(self):
return f“{self.name} 摇尾巴”

class Cat(Animal):
def speak(self):
return f“{self.name} 喵喵叫”

animals = [Dog(“旺财”), Cat(“小白”)]
for a in animals:
print(a.speak())

# 输出:
# 旺财 汪汪叫
# 小白 喵喵叫
这个例子展示了使用抽象父类(Animal)定义通用接口,子类各自实现具体行为的多态特性。

写在最后

类和继承看起来是一堆语法,背后传递的是一种思维方式:把数据和操作数据的方法绑定在一起,用层次结构来描述事物之间的共性差异。

初学者容易犯两个错误:一是为了“面向对象”而去制造不必要的类(一个函数就能解决的事非要包一层);二是继承层次过深,让代码难以追踪。记住,简洁永远是第一位的,清晰比炫技重要得多。

学会类和继承之后,你会开始真正理解 Python 的设计——为什么列表有 .append(),字符串有 .upper(),因为它们背后都是类,万物皆对象。

小建议:动手练习是最好的学习方式。试着创建一个 Rectangle 类,包含宽、高属性和计算面积的方法。然后让它被 Square 继承,体会如何用 super() 重用代码。

标签: 暂无
最后更新:2026年5月7日

admin

这个人很懒,什么都没留下

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2026 年 5 月
  • 2026 年 4 月

分类

  • C++
  • golang
  • javascript
  • python
  • 学习笔记
  • 工具分享

COPYRIGHT © 2026 GXB's Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2024198348号-6