面向对象编程
面向过程编程
面向过程的核心是过程二字,指的是解决问题的流程,即先干什么,再干什么,最后干什么。
举例:把大象装冰箱里分为几部:
1.打开冰箱门
2.把大象放进去
3.关上冰箱门
优点:将复杂的问题流程化,进而简单化。
缺点:牵一发而动全身,扩展性差,可维护性差。
应用场景:对扩展性要求不高的地方。
面向对象的概念
对象的概念
1.程序中:
函数是盛放数据的容器。
对象是盛放数据和函数的容器。
2.现实生活中:
一切皆对象。
对象是特征与技能的结合。
与面向过程的比较
优点:扩展性强,可维护性强。
缺点:编程复杂度高。
应用场景:对扩展性要求高的地方。
举例:选课系统
def choose_course(stu_dict, course): stu_dict['course'].append(course) print('%s选课成功 %s' % (stu_dict['name'], stu_dict['course'])) # 学生作为对象 stu1 = { # 将姓名等作为特征 'name': 'tom', 'age': 18, 'gender': 'male', 'course': [], # 将选课的函数作为技能 'choose_course': choose_course } # 学生作为对象 stu2 = { # 将姓名等作为特征 'name': 'jerry', 'age': 18, 'gender': 'male', 'course': [], # 将选课的函数作为技能 'choose_course': choose_course } # 调用函数将自身作为参数传入 stu1['choose_course'](stu1, 'python') stu2['choose_course'](stu2, 'python')
结果:
类的定义和对象的产生
类的概念
对象是特征和技能的结合体。
类是一系列对象相似的特征与技能的结合体。
对于不同的划分的标准,划分的类不一定一样。
在现实生活中:
是先有对象再有类。
在程序中:
要先定义类再调用类产生对象。
类的定义
定义类的语法:
class 类名():
类体代码
需要注意的是:类名的命名方式一般是驼峰体。
在执行类的代码时:
1.立即执行类体代码。
2.产生一个类的名称空间,将类体代码执行产生的名字都放到类的名称空间中。
3.把类的名称空间绑定给__dict__,用类名__dict__的方式可查看类的名称空间。
依旧以学生选课系统为例:
class Student(): # 定义一个共同属性 school = 'university' # 定义一个技能(函数) def choose_course(stu_dict, course): stu_dict['course'].append(course) print('%s选课成功 %s' % (stu_dict['name'], stu_dict['course'])) # 查看类的名称空间 print(Student.__dict__) # 产生对象 # 调用类产生对象,默认产生的就是一个空对象{} stu1 = Student() print(stu1.__dict__)
结果:
定制对象独有属性
class Student(): # 定义一个属性 school = 'SH' # 初始化方法 # 调用类自动触发的函数 def __init__(self, name, age, gender, course=None): if course is None: course = [] self.name = name self.age = age self.gender = gender self.course = course # return None # 在这个方法中不能有返回值 # 定义一个技能(函数) def choose_course(self, course): self.course.append(course) print('%s选课成功 %s' % (self.name, self.course)) stu1 = Student('tom', 18, 'male') print(stu1.__dict__)
函数在调用时:
1.得到一个空对象
2.调用了student.__dict__
3.得到一个初始化的结果
结果:
属性的查找顺序
类属性:在类中写的属性就是类属性
对象属性:在对象自己的名称空间中的属性就是对象属性
类属性在查找时查找的是类的名称空间中的名称。
对象属性现在对象的名称空间中找,找不到再去类的名称空间找。
调用方法
类中的方法,类可以调用,对象也可以调用。
但是,推荐对象来调用,因为对象来调用,会把自己当成第一个参数传递给函数。
因此在定义对象是推荐将第一个参数写为self(表示自己)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通