Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系。

所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的,“类”本身也是对象,可以更进一步抽象得到“抽象类”,“类”和“抽象类”两者的区别在于前者是从现实对象抽象而来的,后者是基于类抽象而来的,因此“抽象类”只能被继承,不能被实例化,好比我们有香蕉的类、苹果的类、桃子的类,从这些类抽取相同的特征就是水果这个“抽象类”,我们吃水果时要么是吃一个具体的香蕉,要么是吃一个具体的桃子,无法吃到一个叫做水果的东西。

那么我们抽象得到的“抽象类”之后可以继承的方式创建新类,此时原始类称为“父类”或“超类、基类(Base class、Super class)”,新类称为“子类”或“派生类”,当然抽象得到的“类”是可以创建“实例”的。总的来看,无论是继承还是实例化,它们的前提是抽象过程,只有抽象得到“类”后才能展开继承和实例化过程。

这里举个形象的例子来说明下,比如奥巴马和梅西这两个对象抽象得到的共同的特征是人,那么人作为奥巴马和梅西的一个“类”,将人、猪、狗这三个“类”抽象得到的共同的特征是动物,那么动物作为人、猪、狗的一个“父类”。反过来人、猪、狗这三个“类”继承动物这个“父类”的特征,人这个“类”实例化得到了奥巴马和梅西这两个“对象”。

对于继承和派生来说最大的好处是实现代码的重用,比如我们定义了一个类ParentClass1,接着打算新建立另外一个类SubClass1,由于两者的大部分内容相同,此时可以通过继承的方式让SubClass1继承ParentClass1,这样SubClass1则包含了ParentClass1所有的属性,包括了变量(self.name、self.age)和方法(speak),降低了重复的编程工作量,并且派生得到的SubClass1中可以添加新的属性,比如变量self.country和方法write,并不会影响到ParentClass1。(当子类新增的属性与父类重名时,以子类的为准)

class ParentClass1:
def __init__(self, name, age):
self.name = name
self.age = age def speak(self):
print('speak ParentClass1') class SubClass1(ParentClass1):
def __init__(self, name, age, country):
ParentClass1.__init__(self, name, age)
self.country = country def write(self):
print('write SubClass1') b1 = SubClass1('jack', 21, 'China')
print(b1.name) ——> jack
print(b1.age) ——> 21
print(b1.country) ——> China
b1.speak() ——> test ParentClass1
b1.write() ——> test SubClass1' 叉车轮胎更换

上面展示的子类继承一个父类,那么子类也可以继承多个父类。比如子类SubClass2继承了ParentClass1和ParentClass2这两个类。

class ParentClass1:
def __init__(self, name, age):
self.name = name
self.age = age def speak(self):
print('speak ParentClass1') class ParentClass2:
def walk(self):
print('walk ParentClass2') class SubClass2(ParentClass1,ParentClass2):
def __init__(self, name, age, country):
ParentClass1.__init__(self, name, age)
self.country = country b2 = SubClass2('jack', 21, 'China')
b2.speak() —— > speak ParentClass1
b2.walk() —— > walk ParentClass2

除了继承外,组合方式是将其他类作为属性加入到类中来扩展自身的属性资源,这样可以有效地利用其他类的资源,增强代码的重用性。组合与继承的区别主要体现在概念思想上:继承建立的“父类”和“子类”的关系是一种“是”的关系,比如程序员是人类,当“父类”和“子类”之间有很多共同的属性时使用继承比较合适;组合建立的类和组合类的关系是一种“有”的关系,比如程序员有电脑,会编程,而人类并不一定都具备,这样可以把电脑这个“类”以组合的方式添加作为属性,而不用重新再设计这个属性。

class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print('Human speak skill') class Computer:
def __init__(self, model ,brand):
self.model=model
self.brand=brand class Programmer(Human):
def __init__(self, name, age, country, computer):
Human.__init__(self, name, age)
self.country = country
self.computer = computer b3=Programmer('jack', 21, 'China',Computer('X10','dell'))
print(b3.computer.model,b3.computer.brand) —— > ('X10','dell')

Python基础系列讲解——继承派生和组合的概念剖析的更多相关文章

  1. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  2. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  3. Python基础系列讲解—动态类型语言的特点

    前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...

  4. Python基础系列讲解-自动控制windows桌面

    原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...

  5. Python基础系列讲解——try_except异常处理机制

    在Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行.比如以下例程中,使 ...

  6. Python基础系列讲解——时间模块详解大全之time模块

    Python中提供处理时间日期相关的内置模块有time.datetime和calendar. time模块中大多数函数调用了所在平台C library 的同名函数,因此更依赖于操作系统层面,所以tim ...

  7. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  8. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  9. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

随机推荐

  1. regex_iterator

    绝对不能在循环中通过regex_search获取模式在源字符串所有的实例:应该改为regex_iterator或则regex_token_iterator,一般情况下需要位一个特定的容器来指定一个尾迭 ...

  2. node-webkit,nwjs 系统托盘【Tray】实践

    参照自:https://www.cnblogs.com/xuanhun/p/3678943.html Tray包含title.tooltip.icon.menu.alticon五个属性. title属 ...

  3. java学习笔记-JavaWeb篇二

    JavaWEB篇二 45 HttpSession概述46 HttpSession的生命周期 47 HttpSession常用方法示例48 HttpSessionURL重写 49 HttpSession ...

  4. P3133 [USACO16JAN]无线电联系Radio Contact

    题目描述 Farmer John has lost his favorite cow bell, and Bessie the cow has agreed to help him find it! ...

  5. 在线扫描PDF JPG 图片上面文字

    在线扫描PDF JPG 图片上面文字

  6. PHP代码优化—array_push

    PHP中数组插入数据通常有这么几种: 定义的时候直接赋值 $arr = array('apple', 'banana'); 使用数组变量操作 $arr = array(); $arr[] = 'app ...

  7. C++快速开发样本工程的建立--简介

    背景 在开发项目过程中,一些功能库能反复被写被用,可以写成库被重用: 但是行业业务也随着换项目,每次重新写一次,如果把一些功能业务和框架绑定,配置绑定,只需要添加,修改,增加业务功能,就可以搭建C++ ...

  8. 批量分离SQL数据库语句

    --sp_helpdb--查看可用数据库 declare @name sysname, @sql nvarchar(4000) DECLARE roy CURSOR FOR --排除不分离的数据库名就 ...

  9. .net core中使用缓存(cache)

    官方文档:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.2#use ...

  10. JAVAMAIL 530 Error: A secure connection is requiered(such as ssl)

    原因:代码没有开启ssl传输 添加:  props.put("mail.smtp.ssl.enable", "true");           // 设置是否 ...