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,但是调用时,不用传递该参数。

相关推荐
kruptos12 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌13 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc14 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库14 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H14 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒14 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP14 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
2601_9623824315 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
鹏哥带你干乡墅15 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
江畔柳前堤15 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native