python的面向对象编程

为什么要面向对象编程?

伟大的领袖毛泽东曾说过:编程最大的敌人是重复

  • 最开始,在程序中写的一条条语句,在执行的时候会变成一条条指令交给CPU执行。这就是**"程序是指令的集合"** 。
  • 为了简化程序的设计,引入了函数的概念。把相对独立、经常重复使用的代码放到函数中。当一个函数的语句过多的时候,我们就给它拆分成一个个子函数。函数式编程
  • 单当程序到极度复杂的时候,单纯的函数无法满足维护、开发、升级的工作。于是有人提出面向对象编程 。推翻了以 小块函数为单位的思想,而是把数据+函数组成的对象为最小单位。

什么是面向对象编程?

你肯定听过,面向对象的三大要素:封装、继承和多态。

正式的说法:把一组数据结构和处理他们的方法组成对象 (object), 把相同行为的对象归纳为类 (class), 通过类的封装 ( encapsulation)隐藏内部细节,通过继承 (inheritance)实现类的特殊化 (specialization)和 广泛化 (generalization), 通过多态 (polymorphism)实现基于对象类型的动态分派。

是不是很难懂?说起来也拗口,没有基础的人根本看不懂。

这样讲吧,我们在出生的时候就被赋予一个类 (人),我们自身有一些属性 (身高,体重 ,年龄),还有一些技能,也就是方法 ( 吃饭 、呼吸 )

  • 封装:你今年多少岁了,你只需要告诉别人结果,不用告诉人你是怎么算的,不需要知道内部实现细节。这就是封装。
  • 继承:我们之所以有这些属性、技能,是因为我们的父母也是人,我们是遗传基因得来的。
  • 多态:一些人演化出来特有技能,比如倒立洗头,泡妹。但有一些人不会。

说了这么多,面向对象是一种思想,范式,约定。你也可以不这么做,也能写代码,只是可能,当应用复杂到一定程度,只有你看的懂,无法同其他人交流。

面向过程与面向对象对比

假设我们要处理学生的成绩表,打印一个学生的成绩: 姓名 + 分数,面向过程的程序可以用一个dict表示:

python 复制代码
std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }

函数式编程的思想就是,直接思考程序的执行 , 面向过程

python 复制代码
def print_score(std):
    print(f'{std[name]} : {std[score]}')

面向对象的编程思想 ,则首先思考的是 std 应该是一个 学生对象,有 姓名(name) 和 分数 (score) 这两个属性。有一个技能打印成绩 print_score() , 如果要打印成绩需要,先创建一个学生,然后告诉学生我要打印成绩。

python 复制代码
class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
       print(f'{std[name]} : {std[score]}')
python 复制代码
zhangsan = Student('张三', 59)
lisi = Student('李四', 87)
zhangsan.print_score()
lisi.print_score()

类的定义和实例

下面是一个类

python 复制代码
class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
       print(f'{std[name]} : {std[score]}')

__init__是一个特殊方法用于在创建对象时进行初始化操作 , 为学生对象绑定 namescore 两个属性

  • 注意:特殊方法"__init__"前后分别有两个下划线!!!
  • 注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
  • 如果有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

def print_score(self) 和普通的函数相比,在类中定义的函数只有一点不同 ,就是第一个参数永远是实例变量self,但是调用时,不用传递该参数。

相关推荐
好易学·数据结构几秒前
可视化图解算法51:寻找第K大(数组中的第K个最大的元素)
数据结构·python·算法·leetcode·力扣·牛客网·堆栈
纬领网络4 分钟前
Linux环境下安装和使用RAPIDS平台的cudf和cuml - pip 安装方法
开发语言·python·pip
成都犀牛12 分钟前
LlamaIndex 学习笔记
人工智能·python·深度学习·神经网络·学习
猛犸MAMMOTH23 分钟前
Python打卡第53天
开发语言·python·深度学习
寒山李白27 分钟前
Java 传输较大数据的相关问题解析和面试问答
java·开发语言·面试·传输
thinking-fish1 小时前
提示词Prompts(2)
python·langchain·提示词·提示词模板
道剑剑非道1 小时前
QT开发技术【ffmpeg EVideo录屏软件 一】
开发语言·qt·ffmpeg
2501_911828501 小时前
Python训练营---DAY53
python·深度学习
oioihoii1 小时前
C++11 Generalized(non-trivial) Unions:从入门到精通
java·开发语言·c++
谢尔登2 小时前
【Three.js】初识 Three.js
开发语言·javascript·ecmascript