day 28
类
一个常见的类的定义包括了:
1. 关键字class
2. 类名
3. 语法固定符号冒号(:)
4. 一个初始化函数__init__(self)
Pass占位符和缩进
Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句,并且后面跟着冒号 : 时,它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句(即代码块是空的),它就无法确定这个结构的范围,因此会抛出 IndentationError。
pass 语句的存在就是为了解决这个问题:它本身不执行任何操作,但它是一个有效的 Python 语句。所以,当你需要一个语法上存在的代码块,但又暂时不想在其中放入任何实际的逻辑时,pass 就是一个完美的占位符,它告诉解释器:“这里有一个代码块,但它什么也不做。”
class ClassName: # 类名通常遵循大驼峰命名法 (UpperCamelCase),即每个单词的首字母都大写,class是定义类的关键词# 类的代码块 (可以包含属性定义、方法定义等)pass # pass 是一个占位符,表示这里暂时没有任何内容
类的初始化方法
self.xx是用来表明这个属性“归属于”这个类自己的(self)。比如self.name,就代表着:“自己的名字”,self等于“自己”,这个self指向类的实例化地址,传入的self.xx是它的属性。
以后要是用它的属性值,即使是从外界参数传入的,前面也必须加上self.xx,否则传入的参数没价值
class Teacher:def __init__(self, name, age):# 初始化方法,传入了参数self.name = name # 外界的参数,需要通过self.xxx来复制给类自己的属性self.age = ageself.subject = "English" # 这个属性仍然是在创建时就设定好的# 创建一个Teacher对象的例子,构造方法的参数必须
teacher = Teacher("Susan", 33) # 如果在初始化方法中设置了非默认的参数,那么外界就必须要传入才行
print(teacher.name) # 输出: Susan
print(teacher.age) # 输出: 33
print(teacher.subject) # 输出: English
类的普通方法
除了init方法(初始化方法,又名构造方法),还包含一些普通方法(自己定义)
普通方法和init方法的差别在于,init方法是类的构造方法,当创建对象时,会自动调用init方法----只要你创建这个类对象了,这个init函数就会执行
普通方法是只有你调用类的这个方法的时候,函数才会执行
注意!普通方法第一个参数也必须是 self
class Teacher:def __init__(self):self.name = "Susan"self.subject = "English"self.age = 33def teach_lesson(self):print("上课中")def criticize(self):print("批评人")
t = Teacher()
t.teach_lesson() # 调用类的方法
t.criticize()
print(t.name)
类的继承
类已经是比较优秀的封装了,封装了函数、封装了属性
正如装饰器进一步封装了函数的可复用的功能,装饰器函数封装了函数
那么有没有东西可以进一步封装类呢?这就引出了类的继承
在面向对象编程中,继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码复用和功能扩展。子类可以:
1. 复用父类的代码(无需重新实现)。
2. 重写父类的方法(修改或增强功能)。
3. 添加新的方法和属性(扩展功能)。
题目1
定义圆(Circle)类
要求:
1.包含属性:半径 radius。
2.包含方法:
●calculate_area():计算圆的面积(公式:πr²)。
●calculate_circumference():计算圆的周长(公式:2πr)。
3.初始化时需传入半径,默认值为 1。
import mathclass Circle:def __init__(self, radius=1):"""初始化 Circle 类的实例。:param radius: 圆的半径,默认为 1。"""self.radius = radiusdef calculate_area(self):"""计算圆的面积。:return: 圆的面积,使用公式 πr² 计算。"""return math.pi * self.radius ** 2def calculate_circumference(self):"""计算圆的周长。:return: 圆的周长,使用公式 2πr 计算。"""return 2 * math.pi * self.radius
题目2
定义长方形(Rectangle)类
1.包含属性:长 length、宽 width。
2.包含方法:
●calculate_area():计算面积(公式:长×宽)。
●calculate_perimeter():计算周长(公式:2×(长+宽))。 is_square() 方法,判断是否为正方形(长 == 宽)。
3.初始化时需传入长和宽,默认值均为 1。
class Rectangle:def __init__(self, length=1, width=1):"""初始化 Rectangle 类的实例。:param length: 长方形的长,默认为 1。:param width: 长方形的宽,默认为 1。"""self.length = lengthself.width = widthdef calculate_area(self):"""计算长方形的面积。:return: 长方形的面积,使用公式 长×宽 计算。"""return self.length * self.widthdef calculate_perimeter(self):"""计算长方形的周长。:return: 长方形的周长,使用公式 2×(长 + 宽) 计算。"""return 2 * (self.length + self.width)def is_square(self):"""判断该长方形是否为正方形。:return: 如果长等于宽则返回 True,否则返回 False。"""return self.length == self.width
题目3:图形工厂
创建一个工厂函数 create_shape(shape_type, *args),根据类型创建不同图形对象:图形工厂(函数或类)
shape_type="circle":创建圆(参数:半径)。
shape_type="rectangle":创建长方形(参数:长、宽)。
import mathclass Circle:def __init__(self, radius=1):self.radius = radiusdef calculate_area(self):return math.pi * self.radius ** 2def calculate_circumference(self):return 2 * math.pi * self.radiusclass Rectangle:def __init__(self, length=1, width=1):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)def is_square(self):return self.length == self.widthdef create_shape(shape_type, *args):"""根据传入的图形类型和参数创建相应的图形对象。:param shape_type: 图形类型,支持 "circle" 和 "rectangle"。:param args: 创建图形所需的参数,对于 "circle" 是半径,对于 "rectangle" 是长和宽。:return: 相应的图形对象,如果类型不支持则返回 None。"""if shape_type == "circle":if len(args) == 0:return Circle()else:return Circle(*args)elif shape_type == "rectangle":if len(args) == 0:return Rectangle()else:return Rectangle(*args)else:return None
@浙大疏锦行