第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识
Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍。
一、 类和对象(实例)
在面向对象的程序设计(OOP)过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,是抽象的模板。类是由其属性以及支持的方法定义的,类的所有实例都有该类的所有属性和方法,每个对象都属于特定的类,是一个具体存在的实体,是根据类创建出来的一个个具体的“实例”。
类、类型在Python3中是同义词。从很多方面来说,这正是类的定义——一种对象。每个对象都属于特定的类,并被称为该类的实例。在Python中,类名约定使用单数并将首字母大写,如Student和Person。
对象由属性(数据)和方法组成,属性是属于对象的变量,而方法是存储在属性中的函数。每一个对象都从类中继承有相同的方法,但各自的数据可能不同。对象的状态由其属性(如名称)描述,对象的方法可能修改这些属性,因此对象将一系列函数(方法)组合起来,并赋予它们访问一些变量(属性)的权限,而属性可用于在两次方法调用之间存储状态。
二、 子类和超类
一个类的对象(如猪、牛、羊)为另一个类(如家畜)的对象的子集时,前者就是后者的子类,后者是前者的超类(也称为父类、基类)。要定义子类,只需定义多出来的方法和属性,还可能重写一些超类的方法。因此从功能上来说,父类的属性和方法是子类的功能和方法的子集。子类的所有实例都有超类的所有属性和方法。子类比超类会多出特有的属性或方法,或可能重写一些超类的方法。
对于子类和超类,在C++中调用时有两种类型的强制类型转换:
1. 向上类型转换(upcast):将子类型引用转换成父类型引用。
2. 向下类型转换(downcast):将父类型引用转换成子类型引用。对于向下类型转换,必须要显示指定。向下类型转换的原则:父类型引用指向谁才能转换成谁。
而在Python中,则无需关注这种转换,Python编译时不执行类型检查,执行时也不建议使用代码进行类型检查,只关注对象是否有对应方法。
三、 面向对象的特征
Python是一门面对对象编程的语言,面向对象程序设计有三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。
1. 封装:对象可能隐藏其内部状态,对外部隐藏有关对象工作原理的细节,使用者无需知道对象的构造就能使用它。
1) 在有些语言如C++中,这意味着对象的状态(属性)只能通过其方法来访问;
2) 封装就是对对象的部分或全部内部数据进行隔离,隐藏数据特征。这是因为对象中的数据(属性)可能有特殊的操作方法,如果通过外部直接访问数据可能导致异常和错误;
3) 在Python中,所有的属性都是公有的,都可以通过外部访问,但直接访问对象的状态时程序员应谨慎行事,因为这可能导致状态不一致,为此Python没有提供对象强制的访问类型限制,但通过命名规则(前导双下划线)可以隐式地定义无法直接访问的内部属性。具体内容请见后面章节。
2. 继承:继承,一个类可以是一个或多个类的子类,在子类没有重写超类(也称父类、基类,下同)方法的情况下,子类可以使用超类(父类)的方法。继承可以让子类获得超类的全部功能,超类实现过的方法,子类不需要重新定义就能自动拥有。
1) 并不是所有语言都支持指定继承多个超类,Python支持继承多个超类;
2) 可以为子类增加新的方法,这些新方法父类不会掌握。如果子类新定义的方法与父类的方法相同,则子类的方法覆盖父类的方法。在程序运行时总是会调用子类的方法而不是父类的方法。
3) Python对多个超类的使用并不推荐,因为多个超类的情况下,如果某个方法在多个超类中出现,系统可能出现异常。
3. 多态:多态指的是无需知道对象属于哪个类就可调用其方法,对不同类型的对象执行相同的操作。
1) 多态有2种形态
i. 一种是一个超类的多个子类,不同子类中有同样名称的方法,相关方法可能是继承超类的,也可能是子类重写了的,但在调用该方法时,无需知道具体子类的类型。当使用多态方式调用方法时,首先检查父类中是否有此方法,如果没有则编译错误,如果有则再去调用子类重写(Override)【如果重写的话】的此方法,没有重写的话,还是调用从父类继承过来的方法。
ii. 另一种是不同类型都有某些相同的方法,不论该方法是否继承超类、是否方法来自相同的超类、无需关注对应对象是什么类型,只需该对象有对应方法就可以使用。这就是Python支持的“鸭子类型”,关于“鸭子类型”在后面章节专门介绍。
iii. 传统意义的多态主要是指第一种类型的多态,不含第二种类型的多态,所以有人说Python不支持多态,但Python是一种多态语言。
2) 多态是一种运行时行为,不是编译期行为!在编译期间它只知道是一个引用,只有到了执行期,引用才知道指向的是谁。这就是所谓的“软绑定”。
本节介绍了面向对象程序设计相关的基本概念,有关内容涉及面较广,如果大家不好理解,建议自己多找点资料看看。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识的更多相关文章
- 第7章 Python类型、类、协议目录
第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议.多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭 ...
- 使用Nginx+uwsgi在亚马逊云服务器上部署python+django项目完整版(二)——部署配置及相关知识
---恢复内容开始--- 一.前提: 1.django项目文件已放置在云服务器上,配置好运行环境,可正常运行 2.云服务器可正常连接 二.相关知识 1.python manage.py runserv ...
- HTTP协议知多少-关于http1.x、http2、SPDY的相关知识
作为网站开发的基础协议,我们知道浏览器上都有输出http这四个字母,这意味着什么呢? 这就是最基础的HTTP协议. 逐浪君今天为各位大人准备了一些HTTP技术的知识,来和大家分享. 以下图为例: 这一 ...
- 第7.28节 《Python类、类型、协议》章节总结
本章详细介绍了Python协议.多态与"鸭子类型".类.类实例变量.类变量.实例方法.类方法.静态方法.类继承.抽象类.property函数和@property装饰器定义属性访问方 ...
- 《python解释器源码剖析》第13章--python虚拟机中的类机制
13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...
- Python的类与类型
1.经典类与新式类 在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style classes)有个简单的概念. 在Python 2.x及 ...
- python容器类型的协议
1.协议(Protocols)与其他编程语言中的接口恒相似,它规定你哪些地方必须要定义,然而在python中的协议就显得不那么正式,事实上,在python中,协议更像是一种指南. 2.序列类型和映射类 ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- python 教程 第二章、 类型
第二章. 类型 常量 5,1.23,9.25e-3,’This is a string’,”It’s a string!” 1) 数 整数:2 长整数: 浮点数:3.23,52.3E-4 复数:-5+ ...
随机推荐
- [Codeforces 580D]Fizzy Search(FFT)
[Codeforces 580D]Fizzy Search(FFT) 题面 给定母串和模式串,字符集大小为4,给定k,模式串在某个位置匹配当且仅当任意位置模式串的这个字符所对应的母串的位置的左右k个字 ...
- c#方法 最大值我最小值
static void Main(string[] args) { int[] a = { 6, 8, 9, 5, 2, 165, 58966 }; Console.WriteLine("最 ...
- Spark Shuffle机制详细源码解析
Shuffle过程主要分为Shuffle write和Shuffle read两个阶段,2.0版本之后hash shuffle被删除,只保留sort shuffle,下面结合代码分析: 1.Shuff ...
- Netty源码解析 -- 零拷贝机制与ByteBuf
本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现. 源码分析基于Netty 4.1.52 Netty中的零拷贝 Netty中零拷贝机制主要有以下几种 1.文件传输类DefaultF ...
- 大数据分析中数据治理的重要性,从一个BI项目的失败来分析
很多企业在做BI项目时,一开始的目标都是想通过梳理管理逻辑,帮助企业搭建可视化管理模型与深化管理的精细度,及时发现企业经营管理中的问题. 但在项目实施和验收时,BI却变成了报表开发项目,而报表的需求往 ...
- tcpack----- 2sack dack
道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理.这篇blog就主要来介绍内核如何处理sack段 sack dsack概念 TCP在一个RTO超时后会重传数据 ...
- tomcat设置好环境变量,依然无法通过cmd startup命令启动
Windows环境下JDK安装与环境变量配置详细的图文教程 https://www.cnblogs.com/liuhongfeng/p/4177568.html Windows环境下maven 环 ...
- 微信_跳一跳辅助程序_Python_(带GitHub项目地址)
1.安装Python(推荐3.6) https://www.python.org/downloads/ 2.在github上下载脚本 [github项目地址](https://github.com/w ...
- 控制算法PID-理解分析1
以下内容是来自网络上的,本人觉得有道理,拷贝下来,由于没有找到最源头的出处,没有注明来自何方. 转载,下面说法应该更通俗易懂一家庭,每次需要开支的时候丈夫P都要拿卡去取钱.需要多少取多少,因为银行最低 ...
- jboss反序列化漏洞实战渗透笔记
一.利用shodan,fofa或谷歌搜索关键字:8080/jmx-console/ 二.下载java反序列化终极测试工具进行验证漏洞 三.记住User Current Directory: C:\j ...