2026/2/12 17:58:57
网站建设
项目流程
怎样与知名网站做友情链接,根据网站开发app,手机php网站开发,创意画册设计欣赏#x1f4cb; 前言
各位伙伴们#xff0c;大家好#xff01;Day 28 是我们编程思维的一次重大升级。在此之前#xff0c;我们更多的是在编写指令的“脚本”。从今天起#xff0c;我们将学习成为一名“设计师”#xff0c;开始构建拥有属性和行为的“对象”。我们将深入探… 前言各位伙伴们大家好Day 28 是我们编程思维的一次重大升级。在此之前我们更多的是在编写指令的“脚本”。从今天起我们将学习成为一名“设计师”开始构建拥有属性和行为的“对象”。我们将深入探索 Python 面向对象编程 (OOP) 的核心——类 (Class)。可以把类想象成一张“饼干模具”它定义了饼干的形状和配方。而通过这个模具压出来的每一块具体的饼干就是对象 (Object)或实例 (Instance)。今天我们将从零开始学习如何设计我们自己的“模具”如何定义一个类以及pass的妙用。什么是__init__方法给饼干注入灵魂如何为类添加功能教会饼干“跳舞”什么是继承在“圆形模具”基础上创造一个“花边圆形模具”让我们一起进入对象的奇妙世界体验创造的乐趣一、类的蓝图定义与初始化__init__1.1 最简单的类与pass一个类最基本的结构是class关键字后跟类名。如果暂时不想写任何内容可以使用pass作为占位符避免程序因缺少代码块而报错。# 定义一个“狗”的类但还没想好它有什么具体功能classDog:pass# pass 告诉 Python“我知道这里需要代码但先跳过。”# 我们可以创建这个类的实例尽管它什么也做不了my_dogDog()print(my_dog)# 输出: __main__.Dog object at 0x...1.2 初始化方法__init__对象的诞生时刻__init__是一个非常特殊的“魔法方法”也叫构造方法。当一个对象被创建时例如my_dog Dog()__init__方法会自动被调用。它的主要任务是设置这个新对象的初始状态也就是它的属性 (Attributes)。self是__init__方法的第一个参数它代表实例本身。当你创建一个my_dog对象时self就指向my_dog。通过self.属性名 值的方式我们将属性“绑定”到这个实例上。classDog:# 当一只狗“诞生”时我们需要知道它的名字和年龄def__init__(self,name,age):print(f一只名叫{name}的小狗诞生了)# 使用 self 将传入的参数绑定为实例的属性self.namename self.ageage# 创建实例时必须提供 __init__ 方法需要的参数除了 selfdog1Dog(旺财,3)dog2Dog(大黄,5)# 访问实例的属性print(f{dog1.name}今年{dog1.age}岁了。)# 输出: 旺财 今年 3 岁了。print(f{dog2.name}今年{dog2.age}岁了。)# 输出: 大黄 今年 5 岁了。二、赋予蓝图生命类的普通方法如果说属性是对象“是什么”名词那么方法 (Methods)就是对象“能做什么”动词。普通方法是定义在类中、以self为第一个参数的函数。它必须通过实例来调用并且可以访问和操作该实例的属性。__init__方法 vs 普通方法(来自课程的精炼总结)特性__init__方法普通方法调用时机创建实例时自动调用手动通过实例调用是否需要显式调用否是默认名称必须是__init__自定义主要用途初始化实例属性实现类的行为逻辑参数要求第一个参数必须是self第一个参数必须是self返回值必须返回None隐式可以返回任意类型的值classDog:def__init__(self,name):self.namename# 定义一个“叫”的方法defbark(self):print(f{self.name}正在汪汪叫)# 定义一个带参数的“追逐”方法defchase(self,target):print(f{self.name}正在追逐{target})my_dogDog(旺财)# 手动调用实例的方法my_dog.bark()my_dog.chase(一只猫)三、站在巨人的肩膀上类的继承继承是 OOP 的三大支柱之一。它允许我们创建一个新类子类这个新类可以继承一个已存在类父类的所有属性和方法。这样做的好处是代码复用不用重写父类已有的功能。功能扩展可以在子类中添加新功能。功能重写可以修改父类的方法以适应子类的特殊需求。super()的妙用在子类的__init__方法中我们通常需要调用super().__init__(...)。super()函数会返回父类的实例调用它的__init__方法可以帮助我们完成父类部分的初始化工作避免重复代码。# 定义父类警犬classPoliceDog(Dog):# 在括号中指定父类def__init__(self,name,department):# 1. 调用父类的 __init__ 来设置 name 属性super().__init__(name)# 2. 添加子类特有的属性self.departmentdepartment# 3. 添加子类特有的方法deftrack_trace(self):print(f来自{self.department}的警犬{self.name}正在追踪线索。)# 4. 重写父类的方法defbark(self):# 可以在重写时通过 super() 调用父类的原始方法super().bark()print(f{self.name}的叫声充满了威严)# 创建子类实例k9_dogPoliceDog(雷神,缉毒组)# 调用继承自父类的方法k9_dog.chase(嫌疑人)# 调用子类新增的方法k9_dog.track_trace()# 调用被子类重写的方法k9_dog.bark()四、作业实战构建你的几何图形库现在让我们用今天学到的知识来创建我们自己的几何图形类库吧题目一定义圆 (Circle) 类importmathclassCircle:定义一个圆类def__init__(self,radius1):初始化方法接收半径默认为1self.radiusradiusdefcalculate_area(self):计算并返回圆的面积returnmath.pi*self.radius**2defcalculate_circumference(self):计算并返回圆的周长return2*math.pi*self.radius# --- 示例运行 ---circleCircle(5)print(f半径:{circle.radius})# 输出: 半径: 5print(f面积:{circle.calculate_area():.2f})# 输出: 面积: 78.54print(f周长:{circle.calculate_circumference():.2f})# 输出: 周长: 31.42题目二定义长方形 (Rectangle) 类classRectangle:定义一个长方形类def__init__(self,length1,width1):初始化方法接收长和宽默认为1self.lengthlength self.widthwidthdefcalculate_area(self):计算并返回面积returnself.length*self.widthdefcalculate_perimeter(self):计算并返回周长return2*(self.lengthself.width)defis_square(self):判断是否为正方形返回布尔值returnself.lengthself.width# --- 示例运行 (长方形) ---rectRectangle(4,6)print(f长:{rect.length}, 宽:{rect.width})# 输出: 长: 4, 宽: 6print(f面积:{rect.calculate_area()})# 输出: 面积: 24print(f周长:{rect.calculate_perimeter()})# 输出: 周长: 20print(f是否为正方形:{rect.is_square()})# 输出: 是否为正方形: False# --- 示例运行 (正方形) ---squareRectangle(5,5)print(f\n是否为正方形:{square.is_square()})# 输出: 是否为正方形: True题目三图形工厂 (Shape Factory) 函数这个题目是点睛之笔它展示了如何动态地使用我们创建的类。defcreate_shape(shape_type,*args): 一个工厂函数根据给定的类型和参数创建图形对象。 :param shape_type: 字符串, circle 或 rectangle :param args: 创建对象所需的参数 (半径, 或 长和宽) :return: 对应的图形对象, 或 None (如果类型不支持) ifshape_type.lower()circle:# 如果是圆形用 args 创建 Circle 实例# *args 会将元组解包例如 (5,) - 5returnCircle(*args)elifshape_type.lower()rectangle:# 如果是矩形用 args 创建 Rectangle 实例# *args 会将元组解包例如 (3, 4) - 3, 4returnRectangle(*args)else:# 如果类型未知打印错误信息并返回 Noneprint(f错误: 不支持的图形类型 {shape_type})returnNone# --- 示例运行 ---# 创建一个圆形shape1create_shape(circle,5)ifshape1:print(f创建的圆形周长是:{shape1.calculate_circumference():.2f})# 输出: 31.42# 创建一个矩形shape2create_shape(rectangle,3,4)ifshape2:print(f创建的矩形是否为正方形:{shape2.is_square()})# 输出: False# 尝试创建一个不支持的图形shape3create_shape(triangle,10)输出:创建的圆形周长是: 31.42 创建的矩形是否为正方形: False 错误: 不支持的图形类型 triangle五、总结与心得Day 28 的学习是编程思维的一次质变我最大的感受有三点封装的力量 (Encapsulation)我不再需要到处写计算圆面积的公式。我把半径 (self.radius) 和计算面积的方法 (calculate_area)封装在Circle类里。使用者只需要知道如何创建一个Circle对象并调用它的方法而无需关心内部实现细节。这让代码更安全、更易用。抽象与蓝图 (Abstraction)class Circle本身不是任何一个具体的圆它是对所有“圆”这一概念的抽象。它定义了作为一个圆必须有什么半径能做什么计算面积和周长。这种“先设计蓝图再创造实例”的思想是解决复杂问题的基础。组合与创造 (Composition Factory)“图形工厂”这个作业太妙了它让我明白类本身就是一种强大的“零件”。我们可以像搭积木一样用一个更高层次的逻辑工厂函数来动态地组合和创造这些零件构建出更灵活、更强大的系统。从今天起我看待代码的眼光不再仅仅是“一步步的指令”而是“一个个相互协作的对象”。这为理解未来复杂的机器学习库它们都是用类构建的打下了坚实的基础。再次感谢 浙大疏锦行 老师的精彩课程和巧妙的作业设计