python的面向对象编程

为什么要面向对象编程?

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

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

什么是面向对象编程?

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

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

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

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

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

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

面向过程与面向对象对比

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

std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }

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

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

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

class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef print_score(self):print(f'{std[name]} : {std[score]}')
zhangsan = Student('张三', 59)
lisi = Student('李四', 87)
zhangsan.print_score()
lisi.print_score()

类的定义和实例

下面是一个类

class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef 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,但是调用时,不用传递该参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebPages 全局:深入解析现代网页设计与开发

WebPages 全局:深入解析现代网页设计与开发 引言 随着互联网技术的飞速发展,网页设计与开发已经成为了数字化时代的重要组成部分。从简单的文本和图像展示,到如今复杂的多媒体交互体验,网页设计经历了翻天覆地的变化。本文将深入探讨WebPages全局,包括网页设计的基本概念…

Defensor 4.5:构建数据资产为中心的安全运营体系

5月31日“向星力”未来数据技术峰会上,星环科技重磅发布数据安全管理平台 Defensor 4.5版本。新版本引入了以数据资产为中心的数据安全运营体系,通过智能化大模型技术,帮助企业快速、精准地识别核心重要资产;建设全局的数据安全策…

pytorch GPU cuda 使用 报错 整理

GPU 使用、报错整理 1. 使用指定GPU(单卡)1.1 方法1:os.environ[CUDA_VISIBLE_DEVICES]1.2 方法2:torch.device(cuda:2)1.3 报错1:RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asy…

MySQL学习记录 —— 십팔 常用程序和配置文件

文章目录 1、mysqld2、mysql常用命令介绍 3、配置文件语法 1、mysqld mysqld就是MySQL服务器,是一个多线程程序。对数据目录,即mysql的主要工作目录进行访问管理。当mysqld启动时,会侦听指定的端口,处理来自客户端程序的网络连接…

【vue教程】二. Vue特性原理详解

目录 回顾本章涵盖知识点Vue 实例和选项创建 Vue 实例Vue 实例的选项 Vue 模板语法插值表达式指令v-bindv-modelv-on 自定义指令创建自定义指令在模板中使用自定义指令自定义指令的钩子函数自定义指令的实例演示 指令注册局部注册指令过滤器 数据绑定和响应式原理响应式数据绑定…

Oracle逻辑备份

逻辑备份 expdp 备份恢复表空间 创建测试数据 # 创建表空间 create tablespace itpux01 datafile /oradata/fghsdb/itpux01.dbf size 100m autoextend off extent management local autoallocate segment space management auto; create tablespace itpux02 datafile /o…

编程题目积累(day5)

题目: 源数组a,将a中所有元素乘以2之后添加进a,则这个a就叫双倍数组,给你一个数组a,判断它是不是双倍数组,如果是则输出源数组,不是则输出空数组。 补充知识: python中枚举和字典…

OAuth 和 SSO 场景中的 URL 语法解析

OAuth 和 SSO 场景中的 URL 语法解析 在 OAuth 和 SSO (Single Sign-On) 场景中,URL 是一个关键组件,用于在客户端和服务器之间传递认证请求和响应。让我们深入解析这个 URL: https://api.commerce.ondemand.com/occ/oauth/authorize?resp…

【python数据结构精讲】双端队列

通过总结《流畅的Python》等书中的知识,总结Python中常用工具的方法。 deque,学名双端队列。 1. 常用方法 append():队列尾部添加appendleft():队首添加pop():移除队列最后一个元素popleft():移除队列第一…

AI算法14-套索回归算法Lasso Regression | LR

套索回归算法概述 套索回归算法简介 在统计学和机器学习中,套索回归是一种同时进行特征选择和正则化(数学)的回归分析方法,旨在增强统计模型的预测准确性和可解释性, 正则化是一种回归的形式,它将系数估…

并发编程-06之Semaphore

一 Semaphore入门 1.1 什么是Semaphore Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同…

centos部署jar包

第一步: 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里,我在opt新建api目录,将jar文件放入,如下图: 第二步: 将需要读取的配置文件也放入此目录(其他目录也可以,和脚本中…

【笔记】记一次读写分离之shardingsphere.datasource导致数据源为空错误

错误: *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determin…

搭建RAG系统就这么简单:LangChain|RAG是什么?

RAG是什么 “RAG”(Retrieval-Augmented Generation)是一种结合了检索(Retrieval)和生成(Generation)的人工智能技术,它在大模型中被需要的原因包括: 知识丰富性: 大模…

探索数据结构与算法的奇妙世界 —— Github开源项目推荐《Hello 算法》

在浩瀚的编程与计算机科学领域中,数据结构与算法无疑是每位开发者攀登技术高峰的必经之路。然而,对于初学者而言,这条路往往布满了荆棘与挑战。幸运的是,今天我要向大家推荐一个令人振奋的项目——《Hello Algo》,它正…

ubuntu使用kubeadm搭建k8s集群

一、卸载k8s kubeadm reset -f modprobe -r ipip lsmod rm -rf ~/.kube/# 自己选择性删除 坑点哦 rm -rf /etc/kubernetes/ rm -rf /etc/systemd/system/kubelet.service.d rm -rf /etc/systemd/system/kubelet.service rm -rf /usr/bin/kube* rm -rf /etc/cni rm -rf /opt/cn…

C# Winform 自定义事件实战

在C#的WinForms中,自定义事件是一种强大的工具,它允许你创建自己的事件,从而在特定条件下通知订阅者。自定义事件通常用于封装业务逻辑,使代码更加模块化和易于维护。下面我将通过一个实战例子来展示如何在WinForms中创建和使用自…

多线程编程中的条件变量及其优化

本套课在线学习视频(网盘地址,保存到网盘即可免费观看): 链接:https://pan.quark.cn/s/7220b198cf00 在多线程编程中,条件变量是一种用于线程间通信和同步的机制。通过使用条件变量,可以有效地…

Prometheus + alermanager + webhook-dingtalk 告警

添加钉钉机器人 1. 部署 alermanager 1.1 下载软件包 wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz 网址 :Releases prometheus/alertmanager (github.com) 1.2 解压软件包 mkdir -pv …

医日健集团技术力量体现测试的背后

医日健集团覆盖式更新 科技日新月异的时代,医日健集团始终走在行业的前列。近日,医日健集团外勤技术人员全面对市场点位投放的数智药房进行了新系统升级和机器测试,这是医日健对于科技创新的最新尝试。 以客户体验为核心优化新体验 医日健集团…