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节 面向对象程序设计的相关知识的更多相关文章

  1. 第7章 Python类型、类、协议目录

    第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议.多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭 ...

  2. 使用Nginx+uwsgi在亚马逊云服务器上部署python+django项目完整版(二)——部署配置及相关知识

    ---恢复内容开始--- 一.前提: 1.django项目文件已放置在云服务器上,配置好运行环境,可正常运行 2.云服务器可正常连接 二.相关知识 1.python manage.py runserv ...

  3. HTTP协议知多少-关于http1.x、http2、SPDY的相关知识

    作为网站开发的基础协议,我们知道浏览器上都有输出http这四个字母,这意味着什么呢? 这就是最基础的HTTP协议. 逐浪君今天为各位大人准备了一些HTTP技术的知识,来和大家分享. 以下图为例: 这一 ...

  4. 第7.28节 《Python类、类型、协议》章节总结

    本章详细介绍了Python协议.多态与"鸭子类型".类.类实例变量.类变量.实例方法.类方法.静态方法.类继承.抽象类.property函数和@property装饰器定义属性访问方 ...

  5. 《python解释器源码剖析》第13章--python虚拟机中的类机制

    13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...

  6. Python的类与类型

    1.经典类与新式类 在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style classes)有个简单的概念. 在Python 2.x及 ...

  7. python容器类型的协议

    1.协议(Protocols)与其他编程语言中的接口恒相似,它规定你哪些地方必须要定义,然而在python中的协议就显得不那么正式,事实上,在python中,协议更像是一种指南. 2.序列类型和映射类 ...

  8. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  9. python 教程 第二章、 类型

    第二章. 类型 常量 5,1.23,9.25e-3,’This is a string’,”It’s a string!” 1) 数 整数:2 长整数: 浮点数:3.23,52.3E-4 复数:-5+ ...

随机推荐

  1. EntityFramework Core上下文实例池原理分析

    前言 无论是在我个人博客还是著作中,对于上下文实例池都只是通过大量文字描述来讲解其基本原理,而且也是浅尝辄止,导致我们对其认识仍是一知半解,本文我们摆源码,从源头开始分析.希望通过本文从源码的分析,我 ...

  2. VirtualBox上桥接方式安装CentOS之后借助宿主上网

    VirtualBox上桥接方式安装CentOS之后借助宿主上网: 修改centos文件: 1 vi  /etc/sysconfig/network-scripts/ifcfg-eth0 增加以下几项: ...

  3. MySQL全面瓦解10:分组查询和聚合函数

    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). ...

  4. 微软面试题: LeetCode 91. 解码方法 出现次数:3

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 ...

  5. VGA详解及色块碰撞示例

    引言 VGA:video Graphics array,视频图形阵列,阴极射线显像管(CRT)显示器时代产物,很多老显卡.笔记本电脑.投影仪所用接口,已经比较过时. CRT是模拟设备,所以VGA也采用 ...

  6. 2020年SpringCloud 必知的18道面试题

    今天跟大家分享下SpringCloud常见面试题的知识. 1.什么是Spring Cloud? Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序,提供与外 ...

  7. sqlilab less23-less27a

    less23 本关过滤掉了注释符号-- 和#,并且变量带入数据库时被单引号包裹.需要将后边的单引号闭合.使用and '1'='1,将其加在注入语句的末尾,使用suffix参数 less-24 以后填坑 ...

  8. cookie和session的关系和区别

    1.为什么会用到cookie和session 由于http请求是一种无状态的请求,一旦数据交换完毕便会关闭请求,再次交换数据则要再次发起请求,所以服务端无法通过连接追踪会话,确定用户身份,而cooki ...

  9. scala中的val,var和lazy

    转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...

  10. 【C++】归并排序

    性能分析: 时间复杂度:O(n*log(n)) 空间复杂度:O(n) 归并排序算法来自于分而治之思想,"归"是"递归"的意思,"并"是&qu ...