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

day28 python训练营 类的定义与方法

类的定义遵循每一个单词字母都大写

pass代表占位符,表示这里暂时没有内容

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

x =10
if x>5:pass
else:print("x is not greater than 5")
for i in range(3):pass

unexpected EOF while parsing

如果不加pass进循环就会出现如上问题

python依靠缩进来定义代码的结构,当出现class if else for这样的语句,并且后接:

这时就希望有缩进语句来定义代码块

如果没有缩进语句就无法确定结构的范围

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

类的初始化方法 

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

类有两种方法,包括初始化方法or普通放大

以下是teacher类的构建(初始化方法)

class Teacher: # 这里不需要括号def __init__(self): #初始化方法,这里没有传入参数self.name = "Susan" # 给类定义一些属性self.subject = "English"self.age = 33Teacher = Teacher() # 创建一个Teacher类的实例
print(Teacher.name) # 输出: Susan
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

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

类的普通方法

类的初始化和普通方法最大的区别在于

初始化init构建后会一直执行而普通方法只有在调用的时候才会执行

class Teacher:def __init__(self):self.name = "wutinaran"self.age=22self.subject="geography"def teach_lesson(self):print("上课中")def criticize(self):print("批评人")
t= Teacher()
t.teach_lesson()
t.criticize()
print(t.name)

每个信息都定义了一次,在使用过程中都重新调用了一次

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")#普通方法的参可以等到调用该方法的时候再传

类的继承

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

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

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

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

  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}。")class Okteacher(Teacher):def __init__(self,name,subject,age,experience_years):super().__init__(name,subject,age)self.experience_years=experience_yearsdef teach_lesson(self):print(f"{self.name}(特级教师)正在教{self.subject}。")def give_lecture(self,topic):print(f"{self.name}(特级教师)正在举办关于{topic}的讲座。")ok = Okteacher("wtr","geography",22,2)
ok.teach_lesson()
ok.criticize("李同学")
ok.give_lecture("中国的黄土地貌")
# 先沿用之前定义的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("微积分")  # 调用子类新增的方法
 super()函数 除了在构造方法中使用,还可以在其他方法中使用# 定义一个父类
class Animal:def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print(f"{self.name} 发出声音")class Dog(Animal):def speak(self):super().speak()  # 先调用父类的方法print("汪汪叫")    # 再添加子类的行为dog = Dog("旺财", 3)
dog.speak() 

重写父类有两种方法

1、直接重写,优先使用子类同名方法,完全替代父类,父类的逻辑不会执行

2、使用super()重写,保留父类核心逻辑,并在其基础上拓展

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

相关文章:

  • 【Java】ForkJoin 框架
  • linux 1.0.7
  • VC++: identifer “M_PI“ is undefined
  • B3623 枚举排列(递归实现排列型枚举)
  • javaScirpt学习第五章(函数)-第二部分
  • 应用于分子生成的免训练引导多模态流模型 - TFG-Flow 评测
  • 用不太严谨的文字介绍遥测自跟踪天线的基本原理
  • Java中的继承
  • Target店铺应该如何入驻?
  • 自定义Spring Boot Starter
  • 【课堂笔记】标签传播算法Label Propagation Algorithm(LPA)
  • DFS入门刷题
  • vasp的输出文件解读--OUTCAR
  • 常见的RAG文档解析辅助工具汇总及企业选型思考
  • 一周学会Pandas2之Python数据处理与分析-数据重塑与透视-pivot() - 透视 (长 -> 宽,有限制)
  • [SC]SystemC在CPU/GPU验证中的应用(四)
  • 图像修复的可视化demo代码
  • PostIn入门教程 - 使用IDEA插件快速生成API接口定义
  • 流媒体基础分析:延迟分析与安全性保障
  • 牛客小白月赛117
  • Baklib知识中台驱动服务升级
  • OD 算法题 B卷【模拟消息队列】
  • Linux环境搭建MCU开发环境
  • [001]从操作系统层面看锁的逻辑
  • 计算机组织原理第三章
  • LearnOpenGL-笔记-其十二
  • 《高等数学》(同济大学·第7版) 的 详细章节目录
  • 顺序查找与折半查找
  • [python]Prophet‘ object has no attribute ‘stan_backend‘解决方法
  • Lyra学习笔记 Experience流程梳理