第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+ ...
随机推荐
- .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?
奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...
- SQL数据库表结构的修改(sql2005)
一 .ALTER TABLE命令 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 二.添加列 语法 :ALTER TABLE table_name ADD column_name d ...
- 学习.NET 挑战赛
今天访问dot.net 网站看到了一个学习.NET 挑战赛,发现已经赛程过半了,这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动,这些模块必须在 11 月底前完成.参加 ...
- 日志切分神器--logrotate
Blog:博客园 个人 概述 还在自己写定时切分日志的脚本?试试系统自带的logrotate工具吧! logrotate是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件, ...
- mybatis print sql config
log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log ...
- 01 Servlet技术
Servlet 1.Servlet技术 1.1.什么是Servlet Servlet是JavaEE规范之一.规范就是接口 Servlet就JavaWeb三大组件之一.三大组件分别是:Servlet程序 ...
- kettle练习
Kettle实现,把数据从CSV文件复制到Excel文件. 首先,创建一个转换,找到核心对象,找到输入里面的CVS文件输入图元,拖拽到工作区域,双击CVS文件输入. 可以修改步骤的名称,点击浏览,选择 ...
- ServiceStack.Redis 的 ASP.NET Core 扩展库
给大家安利一款 ServiceStack.Redis 的 ASP.NET Core 扩展库,它是基于 ServiceStack.Redis.Core 开发的. 简单易用,开源免费,使用ASP.NET ...
- 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!
静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...
- Mac垃圾忘记清理?开启自动清理提醒帮助你!
Mac系统被广泛应用于各种职场生活和学习生活上,平时由于工作和学习忙碌,用户难免会忽略了对Mac的照料,Mac在日复一日地使用中,必定会逐渐变得"臃肿",系统中存在着各种文件缓存垃 ...