Python 类的定义与继承
在学习 Python 的过程中,类是一个重要的概念。今天,我们来深入探讨一下类的定义与继承。
类的复习
相信大家都已经接触过类的概念了,类就像是一个模板,通过对模板实例化可以实现调用这个类的属性和方法。比如说,创建一个随机森林类,我们就可以方便地调用它的训练和预测方法。
定义一个类
现在,我们来学习如何自己定义一个类,这将帮助我们对类这一概念有更深刻的理解。定义一个类通常包括以下几个要素:
- 关键字 class :用于声明一个类。
- 类名 :通常遵循大驼峰命名法(UpperCamelCase),即每个单词的首字母都大写。
- 冒号(: :在类名后面加上冒号表示类的开始。
- 初始化函数 init(self) :用于初始化类的实例,注意 init 左右各有两个下划线,需要传入 self 这个特殊的参数,它指向类的实例化地址。
下面是一个简单的类定义示例:
class Teacher:
def __init__(self):
self.name = "Susan"
self.subject = "English"
self.age = 33
Pass 占位符
在定义类或者其他代码结构时,我们有时会先用 pass 占位,避免运行错误。等到想好具体要写什么再去补充代码。例如:
class ClassName:
pass
在条件语句、循环语句、异常处理语句等依赖缩进的语句中,都可以用 pass 语句来占位。
x = 10
if x > 5:
pass
else:
print("x is not greater than 5")
for i in range(3):
pass
try:
print("hh")
except SomeError:
pass
finally:
pass
初始化方法与普通方法
初始化方法
初始化方法也叫构造方法,它是在创建对象时自动调用的。它用于初始化实例属性。例如:
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
self.subject = "English"
teacher = Teacher("Susan", 33)
print(teacher.name) # 输出: Susan
print(teacher.age) # 输出: 33
print(teacher.subject) # 输出: English
普通方法
普通方法是自己定义的方法,只有在调用类的这个方法的时候,函数才会执行。例如:
class Teacher:
def __init__(self):
self.name = "Susan"
self.subject = "English"
self.age = 33
def teach_lesson(self):
print("上课中")
def criticize(self):
print("批评人")
t = Teacher()
t.teach_lesson() # 上课中
t.criticize() # 批评人
print(t.name) # Susan
类的继承
继承是面向对象编程的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码复用和功能扩展。
基本概念
子类可以复用父类的代码,也可以重写父类的方法,还可以添加新的方法和属性。例如:
class Teacher:
def __init__(self, name, subject, age):
self.name = name
self.subject = subject
self.age = age
def teach_lesson(self):
print(f"{self.name}正在教{self.subject}。")
def criticize(self, student_name):
print(f"{self.name}正在批评{student_name}。")
class MasterTeacher(Teacher):
def __init__(self, name, subject, age, experience_years):
super().__init__(name, subject, age)
self.experience_years = experience_years
def teach_lesson(self):
print(f"{self.name}(特级教师)正在用高级方法教授{self.subject}。")
def give_lecture(self, topic):
print(f"{self.name}正在举办关于{topic}的讲座。")
master = MasterTeacher("王教授", "数学", 45, 20)
master.teach_lesson() # 王教授(特级教师)正在用高级方法教授数学。
master.criticize("李同学") # 王教授正在批评李同学。
master.give_lecture("微积分") # 王教授正在举办关于微积分的讲座。
super() 函数
super() 是一个内置函数,可以用来调用父类的方法。除了在构造方法中使用,还可以在其他方法中使用。例如:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print(f"{self.name} 发出声音")
class Dog(Animal):
def speak(self):
super().speak() # 先调用父类的方法
print("汪汪叫") # 再添加子类的行为
dog = Dog("旺财", 3)
dog.speak()
这样,子类就可以在保留父类方法核心逻辑的基础上,进行功能扩展。
通过以上对类的定义与继承的学习,我们对 Python 中的面向对象编程有了更深入的理解。在实际编程中,合理地运用类和继承可以提高代码的可复用性和可维护性。
作业
作业一:
import math
class Circle:
def __init__(self, radius=1):
# 初始化圆的半径,默认值为 1
self.radius = radius
def calculate_area(self):
# 计算圆的面积,使用公式 πr²
return math.pi * self.radius ** 2
def calculate_circumference(self):
# 计算圆的周长,使用公式 2πr
return 2 * math.pi * self.radius
作业二:
class Rectangle:
def __init__(self, length=1, width=1):
# 初始化长方形的长和宽
self.length = length
self.width = width
def calculate_area(self):
# 计算长方形的面积
return self.length * self.width
def calculate_perimeter(self):
# 计算长方形的周长
return 2 * (self.length + self.width)
def is_square(self):
# 判断长方形是否为正方形
return self.length == self.width
作业三:
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def calculate_circumference(self):
return math.pi * self.radius ** 2
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def is_square(self):
return self.length == self.width
def create_shape(shape_type, *args):
if shape_type == "circle":
if len(args) != 1:
raise ValueError("创建圆需要一个参数:半径")
return Circle(args[0])
elif shape_type == "rectangle":
if len(args) != 2:
raise ValueError("创建长方形需要两个参数:长和宽")
return Rectangle(*args)
else:
raise ValueError(f"不支持的图形类型: {shape_type}")