当前位置: 首页 > news >正文

DAY28类

类是对属性和方法的封装,可以理解为模板,通过对模板实例化可以实现调用这个类的属性和方法。比如创建一个随机森林类,然后就可以调用他的训练和预测方法。

现在我们来学一下自己定义一个类,这会让我们对于类这个对象理解的更加深刻。

一个常见的类的定义包括了:

  1. 关键字class
  2. 类名
  3. 语法固定符号冒号(: )
  4. 一个初始化函数__init__(self)

注意:注意:init左右各有两个下划线__,需要传入self这个特殊的参数。

Pass占位符和缩进

class是定义类的关键词
类的代码块 (可以包含属性定义、方法定义等)

class ClassName: # 类名每个单词的首字母都大写,class是定义类的关键词# 类的代码块 (可以包含属性定义、方法定义等)pass # pass 是一个占位符,表示这里暂时没有任何内容

许多时候,当规划好准备写一个函数、或者一个类,关键词定义后,会先用pass占位,避免运行错误,等到想好写什么再去补上

比如def、class这些定义的关键词后,必须有一个有占据缩进位置的代码块。

还有下面这些依赖缩进的语句,都可以用pass语句来占位,否则会报错

# 条件语句
x = 10
if x > 5:pass# 如果这里是空的,就会报错,可以注释试一下,即使x=1也会报错
else:print("x is not greater than 5")# 循环语句
for i in range(3):pass # 循环体是空的

搞个pass,让程序运行,后续想要执行了,再补充进去

try:# 尝试执行的代码print("hh")
except SomeError:pass# 捕获到异常后,这里需要代码
finally:pass# 无论如何都会执行的代码块,也需要内容

总结:
Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句,并且后面跟着冒号 : 时,它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句(即代码块是空的),它就无法确定这个结构的范围,因此会抛出 IndentationError。

pass 语句的存在就是为了解决这个问题:它本身不执行任何操作,但它是一个有效的 Python 语句。所以,当你需要一个语法上存在的代码块,但又暂时不想在其中放入任何实际的逻辑时,pass 就是一个完美的占位符,它告诉解释器:“这里有一个代码块,但它什么也不做。”

类的初始化方法

初始化方法又叫构造方法、特殊方法

类有2种方法

  1. 初始化方法,
  2. 普通放大
class Teacher: # 这里不需要括号def __init__(self): #初始化方法,这里没有传入参数self.name = "Susan" # 给类定义一些属性self.subject = "English"self.age = 33Teacher = Teacher() # 创建一个Teacher类的实例
print(Teacher.name) # 输出: Susan

下面是在_init_()括号里传入参数,是外来的,即name其实是外面赋值过的参数,我们可以修改参数达到改变

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

teacher = Teacher(“Susan”, 33) # 如果在初始化方法中设置了非默认的参数,那么外界就必须要传入才行
,不是在Teacher类中定义的默认参数,需要自己定义。

其中,self.xx是用来表明这个属性“归属于”这个类自己的(self)。比如self.name,就代表着:“自己的名字”,self等于“自己”,这个self指向类的实例化地址,传入的self.xx是它的属性。
以后要是用它的属性值,即使是从外界参数传入的,前面也必须加上self.xx,否则传入的参数没价值(例外的情况我们不提)

类的普通方法

除了init方法(初始化方法,又名构造方法),还包含一些普通方法(自己定义)

普通方法和init方法的差别在于,init方法是类的构造方法,当创建对象时,会自动调用init方法----只要你创建这个类对象了,这个init函数就会执行

普通方法是只有你调用类的这个方法的时候,函数才会执行

特性init 方法普通方法
调用时机创建实例时自动调用手动通过实例调用
是否需要显式调用
默认名称必须是 init自定义
主要用途初始化实例属性实现类的行为逻辑
参数要求第一个参数必须是 self第一个参数必须是 self
返回值必须返回 None(隐式)可以返回任意类型的值
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)

o1o,class是一个方法类,有很多方法,即函数,是.后面的内容

class Teacher:# 初始化方法接受参数以动态设置教师的属性def __init__(self, name, subject, age):self.name = nameself.subject = subjectself.age = age# 不是init的都叫做普通方法# 普通方法,模拟教师上课的行为def teach_lesson(self):print(f"{self.name}正在教{self.subject}。")# 另一个普通方法,模拟教师批评学生的行为def criticize(self, student_name):print(f"{self.name}正在批评{student_name}。")# 创建Teacher类的实例
teacher = Teacher("Susan", "English", 33)# 调用教师的方法
teacher.teach_lesson()
teacher.criticize("John")#普通方法的参可以等到调用该方法的时候再传

创建Teacher类的实例
teacher = Teacher(“Susan”, “English”, 33)
按照init传入参数,后续也可以通过
teacher.criticize(“John”)#普通方法的参可以等到调用该方法的时候再传

类的继承

类已经是比较优秀的封装了,封装了函数、封装了属性

正如装饰器进一步封装了函数的可复用的功能,装饰器函数封装了函数

那么有没有东西可以进一步封装类呢?这就引出了类的继承

在面向对象编程中,继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码复用和功能扩展。子类可以:

  1. 复用父类的代码(无需重新实现)。

  2. 重写父类的方法(修改或增强功能)。

  3. 添加新的方法和属性(扩展功能)。

仔细观察下方实例代码的注释,写的非常详细

# 先沿用之前定义的teacher类
class Teacher:def __init__(self, name, subject, age):self.name = nameself.subject = subjectself.age = agedef teach_lesson(self):print(f"{self.name}正在教{self.subject}。")def criticize(self, student_name):print(f"{self.name}正在批评{student_name}。")# 继承 Teacher 类,起名特级教师
class MasterTeacher(Teacher): # 1. 继承需要在括号中指定父类def __init__(self, name, subject, age, experience_years):# 2. 继承的时候需要调用父类的构造方法,所以需要传入父类的参数,同时也可以传入自己的参数# 调用父类的构造方法初始化基本属性super().__init__(name, subject, age) # 3. 调用父类的构造方法,这里的super()是一个内置函数,返回父类的实例# 4. 此时子类自动拥有了父类的属性和方法# 添加子类特有的属性self.experience_years = experience_years # 5. 子类特有的属性可以在这里定义# 重写父类方法,增强功能-----如果子类定义了与父类同名的方法,子类实例会优先调用子类的方法。def teach_lesson(self): # 6. 重写父类的方法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("微积分")  # 调用子类新增的方法

首先得在定义class 那一行()里添加父类
可以选用同名属性,优先子类
def init(self, name, subject, age, experience_years):# 2. 继承的时候需要调用父类的构造方法,所以需要传入父类的参数,同时也可以传入自己的参数,也要初始化的

3.super().init(name, subject, age) # 3. 调用父类的构造方法,这里的super()是一个内置函数,返回父类的实例

  1. 此时子类自动拥有了父类的属性和方法
    # 添加子类特有的属性

    self.experience_years = experience_years # 5. 子类特有的属性可以在这里定义
    这在父类通过 `super().__init__()` (见注3) 初始化后进行。
    

super()是Python中的一个内置函数,主要用于在继承关系中访问父类(超类)的方法和属性。它的作用包括:

  1. 调用父类的构造方法
    从您的代码中可以看到:

    super().__init__(name, subject, age)  # 调用父类的构造方法初始化基本属性
    

    这样子类就能继承父类的属性,不需要重复编写相同的初始化代码。

  2. 调用父类的普通方法

    def speak(self):super().speak()  # 先调用父类的方法print("汪汪叫")   # 再添加子类的行为
    

    这使得子类可以在扩展父类功能的同时保留原有行为。

  3. 优势

    • 避免直接使用父类名称,使代码更易维护
    • 支持多重继承中的方法解析顺序(MRO)
    • 确保每个父类方法只被调用一次

在复杂的继承结构中,super()能正确处理菱形继承问题,比使用直接的父类名调用更安全可靠。
浙大疏锦行-CSDN博客

http://www.xdnf.cn/news/557083.html

相关文章:

  • MYSQL备份恢复知识:第四章:备份锁
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • MySQL中添加一个具有创建数据库权限的用户
  • Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
  • C/C++ Select Poll Epoll 多路转接
  • python -> matplotlib简单用法
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • Wan2.1 加速推理方法
  • 使用cursor自动生成前后端分离的web应用程序
  • ROS2 pkg 创建功能包
  • [ 计算机网络 ] 深入理解OSI七层模型
  • 经验过程简介与suprema的集中(Guntuboyina理论统计学笔记)
  • QT高DPI支持
  • linux之 pcie MSI-X中断编程
  • 自动化测试核心知识梳理与 Java 代码详解
  • 基于正点原子阿波罗F429开发板的LWIP应用(3)——Netbiosns功能
  • 嵌入式培训之系统编程(一)标准IO、文件操作
  • Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制
  • 特定领域 RAG中细调嵌入模型能否提升效果?
  • IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术​
  • PostgreSQL简单使用
  • 深入浅出人工智能:机器学习、深度学习、强化学习原理详解与对比!
  • 【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
  • 第六天的尝试
  • 服务器部署1Panel
  • 證券行業證券交易系統開發方案
  • 基于SpringBoot+Vue的学籍管理系统的设计与实现
  • Kubernetes在线练习平台深度对比:KillerCoda与Play with Kubernetes
  • 【开源工具】文件夹结构映射工具 | PyQt5实现多模式目录复制详解
  • 【鸿蒙开发】Hi3861学习笔记- MQTT通信