python数据结构之面向对象

目录
  • 1. 面向对象编程
  • 2. 构建类
  • 3. 继承
    • 3.1 继承案例

python数据结构:数据类型.
 python数据结构输入输出及控制和异常.

今天我们来学习面向对象编程,面向对象这种编程方式非常重要,我们以后学习到的栈、队列、链表都是通过面向对象的方式实现的。

1. 面向对象编程

定义:面向对象是按照人们客观世界的系统思维方式,采用基于对象(实体)的概念建立模型 ,模拟客观世界分析,设计,实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统的一一对应。

听到这很多同学应该会很蒙,我解释一下几个关键词的概念:

  • 对象:一切事物都可以是对象,更准确的说,对象是一个实体,用一组可识别的特征和行为来标识,可以说对象不同的地方就是具有不同的特征与行为。
  • 类:是具有相同属性和功能的对象抽象集合

实例:就是创建具体对象的过程
举一个面向对象的例子:我们需要造一辆车,我们可能并不需要知道车的原理,我们只需要找到车的轮子,车的车架,车的发动机,然后将它们拼装在一起即可。

在前面我们已经使用了一些內建的类来展示数据和控制结构的例子。面向对象编程语言最强大的一项特性是允许程序员(问题求解者) 创建全新的类来对求解问题所需的数据进行建模。

我们之前使用了抽象数据类型来对数据对象的状态及行为进行逻辑描述。通过构建能实现抽象数据类型的类,可以利用抽象过程,同时为真正在程序中运用抽象提供必要的细节。每当需要实现抽象数据类型时,就可以创建新类。

2. 构建类

我们来构建一个分数类fraction类:

你这不能用除法?其实是可以,但是除法的方式python已经有自己的类了,我这里需要自己创建一个分数类。

所有类都应该首先提供构造方法。构造方法定义了数据对象的创建方式。要创建 Fraction 类的实例,必须调用构造方法,要创建一个 Fraction 对象,需要提供分子和分母两部分数据。

class fraction: #定义一个类
    def __init__(self,top,bottom):#定义构造方法 __init__
        self.num=top
        self.den=bottom

这里解释一下,self 是一个总是指向对象本身的特殊参数,它必须是第一 个形式参数。然而,在调用方法时,从来不需要提供相应的实际参数。如前所述,分数需要分子与分母两部分状态数据。构造方法中的 self.num 定义了 Fraction 对象有一个叫作 num 的内部数据对象作为其状态的一部分。同理,self.den 定义了分母。这两个实际参数的值在初始时,赋给了状态,使得新创建的 Fraction 对象能够知道其初始值。

class fraction: #定义一个类
    def __init__(self,top,bottom):#定义构造方法 __init__
        self.num=top
        self.den=bottom

myfraction = fraction(3,5)#使用类创建一个对象。

我们可以用下面这个图来描述,我们构造类一个类,然后通过类创建了一个对象。

一般情况下,我们定义了一个类,里面会有这个类的一些方法,例如,我要查看这个分数对象的样子,我要计算这中类型的分数,等等方法,这些都需要我们去定义。

class fraction: #定义一个类
    def __init__(self,top,bottom):#定义构造方法 __init__
        self.num=top
        self.den=bottom

    def show(self): #定义输出方法
        print(self.num,"/",self.den)

    def add(self,otherf): #定义分数加法
        bot=otherf.den * self.den
        top=self.num * otherf.den +self.den * otherf.num
        print(top,"/",bot)

#定义两个分数
myfraction=fraction(9,16)
a=fraction(1,16) 

#试试加法
myfraction.add(a)

结果如下:

这里我们放上我们写好的分数类定义方法。

class Fraction:
    def __init__(self, top, bottom):
        self.num = top
        self.den = bottom
    def __str__(self):
        return str(self.num) + "/" + str(self.den)

    def show(self):
        print(self.num, "/", self.den)

    def __add__(self, otherfraction): #加法 ,可以用+
        newnum = self.num * otherfraction.den + self.den * otherfraction.num
        newden = self.den * otherfraction.den
        common = gcd(newnum, newden)
        return Fraction(newnum//common, newden//common)

    def __eq__(self, other): #深相等,值相等就相等
        firstnum = self.num * other.den
        secondnum = other.num * self.den
        return firstnum == secondnum

3. 继承

继承是面向对象编程的一个重要特征:使一个类与另一个类相关联,就像人们相互联系一样。孩子从父母那里继承了特征,python的子类可以从父类那继承数据和行为,父类也称为超类。

就拿我们前面学习过的基础数据结构举例。

列表、字符串和元组都是有序集合。它们都继承了共同的数据组织和操作。不过,根据数据是否同类以及集合是否可修改,它们彼此又有区别。子类从父类继承共同的特征,但是通过额外的特征彼此区分。

3.1 继承案例

我们这里通过一个小的案例来实现继承的案例,我们来构建一个模拟程序,用于模拟数字电路。逻辑门是这个模拟程序的基本构造单元,它们代表其输入和输出之间的布尔代数关系。

通过不同的模式将这些逻辑门组合起来并提供一系列输入值,可以构建具有逻辑功能的电 路。图 1-10 展示了一个包含两个与门、一个或门和一个非门的电路。两个与门的输出直接作为 输入传给或门,然后其输出又输入给非门。如果在 4 个输入处(每个与门有两个输入)提供一系列值,那么非门就会输出结果。

为了实现电路,首先需要构建逻辑门的表示。可以轻松地将逻辑门组织成类的继承层次结构, 如图所示。顶部的 LogicGate 类代表逻辑门的通用特性:逻辑门的标签和一个输出。下面 一层子类将逻辑门分成两种:有一个输入的逻辑门和有两个输入的逻辑门。再往下,就是具体的逻辑门。

首先定义父类LogicGate

class LogicGate:
    def __init__(self, n):#构造函数,label代表的是自己的名字
        self.label = n
        self.output = None
    def getLabel(self):#输出名字的函数
        return self.label
    def getOutput(self):#输出的结果
        self.output = self.performGateLogic()
        return self.output

目前还不用实现 performGateLogic 函数。原因在于,我们不知道每一种逻辑门将如何进 行自己的逻辑运算。这些细节会交由继承层次结构中的每一个逻辑门来实现。这是一种在面向对象编程中非常强大的思想——我们创建了一个方法,而其代码还不存在。参数 self 是指向实际调用方法的逻辑门对象的引用。任何添加到继承层次结构中的新逻辑门都仅需要实现之后会被调用的 performGateLogic 函数。一旦实现完成,逻辑门就可以提供运算结果。扩展已有的继承层次结构并提供使用新类所需的特定函数,这种能力对于重用代码来说非常重要。

定义子类BinaryGate类、UnaryGate类

两个类中的构造方法首先使用 super 函数 来调用其父类的构造方法。当创建 BinaryGate 类的实例时,首先要初始化所有从LogicGate 中继承来的数据项,在这里就是逻辑门的标签。接着,构造方法添加两个输入(pinA 和 pinB)。 这是在构建类继承层次结构时常用的模式。子类的构造方法需要先调用父类的构造方法,然后再 初始化自己独有的数据。

BinaryGate类主要是与门和或门(有两个输入)

class BinaryGate(LogicGate):
    def __init__(self, n):
        super().__init__(n)#继承父类的构造方法
        self.pinA = None #添加自己的参数
        self.pinB = None

    def getPinA(self):#自己的方法
        return int(input("Enter Pin A input for gate "+self.getLabel() + "-->"))

    def getPinB(self):#自己的方法
        return int(input("Enter Pin B input for gate "+self.getLabel() + "-->"))

UnaryGate类主要是非门(只有一个输入)。

class UnaryGate(LogicGate):
    def __init__(self, n):
        super().__init__(n)#继承父类的构造方法
        self.pin = None#添加自己的参数
    def getPin(self):#自己的方法
        return int(input("Enter Pin input for gate " + self.getLabel() + "-->"))

构造孙类(与门、或门、非门)

与门 AndGate类

#构造与门
class AndGate(BinaryGate):
    def __init__(self, n):
        super().__init__(n)#继承父类方法
    def performGateLogic(self):#自己的运算逻辑
        a = self.getPinA()
        b = self.getPinB()
        if a==1 and b==1:
            return 1
        else:
            return 0

或门 OrGate

class OrGate(BinaryGate):
    def __init__(self, n):
        super().__init__(n)#继承父类方法
    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a==1 or b==1:
            return 1
        else:
            return 0

非门 NotGate

class NotGate(UnaryGate):
    def __init__(self, n):
        super().__init__(n)
    def performGateLogic(self):
        a = self.getPin()
        if a==1:
            return 0
        else:
            return 1

测试一下结果:

与门

或门

非门

参考资料:

  • 《python数据结构与算法》
  • 《大话数据结构》

到此这篇关于python数据结构之面向对象的文章就介绍到这了,更多相关python面向对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python面向对象编程之类的引用

    目录 1.引用的概念 2.对象的拷贝 2.1 实例方法的引用 2.2 类的特性装饰器 3.类的名称修饰 3.1 _单下划线开头的名称修饰 3.2 _单下划线结尾的名称修饰 3.3 __双下划线开头的名称修饰 3.4 __name__双下划线开头和结尾的名称修饰 3.5 单下划线 4.Python的最小空类 1.引用的概念 引用 (Reference)是对象的指针 引用是内存中真实对象的指针,表示为变量名或者内存地址 每个对象存在至少一个引用,id()函数用于获得引用 在传递参数和赋值时,Pyth

  • python 面向对象之class和封装

    # 封装 # Python并没有真正的私有化支持,但可用下划线得到伪私有 访问私有变量:实例._类名__变量名 访问私有方法:实例._类名__方法名() class Wife02(): def __init__(self,name,age,sex): # 负责对象的初始化 self.set_name(name) self.set_age(age) self.set_sex(sex) def set_name(self,value): if isinstance(value,str): # 数据类

  • python数据结构输入输出及控制和异常

    目录 1. 输入 input 2. 输出 print 2.1 普通输出 2.2 格式化输出 3. 控制语句 4. 异常处理 前言: python数据类型: python数据结构之数据类型. 今天我们主要来介绍一些内置函数,比如输入输出,控制,和异常的用法,尤其是输出和控制,用的太多了,写算法题,输出数据格式问题,对以后都会很有帮助. 1. 输入 input 程序经常需要与用户进行交互,以获得数据或者提供某种结果.Python 提供了一个函数,它使得我们可以要求用户输入数据并且返回一个字 符串的引

  • Python面向对象之入门类和对象

    目录 什么是面向对象编程? 定义类,从具体代码来感受吧! 多个类和对象的观察 补充一下类的属性(数据部分) 总结 什么是面向对象编程? 我们是不是听过面向过程,拿来放在一起对比就比较好理解了. 简单来理解,面向过程就是一切用函数解决一切文件,简单粗暴! 面向对象是面向过程编程之后才出现了,没有面向对象编程很多程序还不是照样开发. 面向对象,也使用函数,但是多了一个网,这个网把一个或者多个函数,和数据关联在一起,然后称为一类事物,也就是程序中的'类'(class) 定义类,从具体代码来感受吧! 面

  • Python从入门到实战之数据结构篇

    前言 我是栗子--专为小白准备<Python从入门到实战>内容. 这不是上一期刚讲完循环判断,还给大家出了很多新手的题目,边学边练习才有效果嘛. 时隔几天,大家都吼完了叭~实在没写完的慢慢复习,我更新文章也挺慢的!哈哈哈哈 今天想一想:要学数据结构啦~ 一.Python有那几种数据结构? Python 有四种数据结构,分别是:列表.字典.元组,集合.每种数据结构都有自己的特点,并且都有着独到的用处.为了避免过早地陷入细枝末节. 我们先从整体上来认识一下这四种数据结构:从最容易识别的特征上来说,

  • Python面向对象之类和对象

    目录 类 定义类 定义类和属性 类中方法 对象方法(普通方法) 类方法 静态方法 魔术方法 对象 创建对象 对象属性 总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所有未定义父类的类都继承object 格式:class 类名[(父类)]: #两种方式意思相同 class Person: pass class Person(object): pass 定义类和属性 name.age.subject就是类属性 class Student: #类属性 name = '' age

  • python数据结构:数据类型

    目录 1.数据是什么? 2.数据类型 2.1内建原子数据类型 2.2 内建集合数据类型 3.集合数据类型的方法 3.1 列表 3.2 字符串 3.3 元祖 3.4 集合 3.5 字典 1.数据是什么? 在 Python 以及其他所有面向对象编程语言中,类都是对数据的构成(状态)以及数据 能做什么(行为)的描述.由于类的使用者只能看到数据项的状态和行为,因此类与抽象数据类 型是相似的.在面向对象编程范式中,数据项被称作对象.一个对象就是类的一个实例. 2.数据类型 2.1内建原子数据类型 Pyth

  • Python面向对象三大特征 封装、继承、多态

    目录 1.封装 1.1 私有属性和私有方法 2.继承 2.1 方法的重写 2.2 在子类方法中调用父类方法 2.3 多继承 2.4 新式类和经典类 3.多态 1.封装 封装: 根据 职责 将 属性 和 方法 封装到一个 抽象的类 中将数据(属性)和行为(方法)包装到类对象中.在方法内部对属性进行操作,在类对象的外部调用方法.这样无需关心方法 内部的具体实现,从而隔离了复杂度 封装是面向对象编程的一大特点 面向对象编程的第一步.将属性和方法封装到一个抽象的类中 外界使用类创建对象,然后让对象调用方

  • python数据结构之面向对象

    目录 1. 面向对象编程 2. 构建类 3. 继承 3.1 继承案例 python数据结构:数据类型.  python数据结构输入输出及控制和异常. 今天我们来学习面向对象编程,面向对象这种编程方式非常重要,我们以后学习到的栈.队列.链表都是通过面向对象的方式实现的. 1. 面向对象编程 定义:面向对象是按照人们客观世界的系统思维方式,采用基于对象(实体)的概念建立模型 ,模拟客观世界分析,设计,实现软件的办法.通过面向对象的理念使计算机软件系统能与现实世界中的系统的一一对应. 听到这很多同学应

  • python数据结构之递归方法讲解

    目录 1.递归概念 2. 递归三原则 2.1 实现任意进制的数据转换 今天我们来学习python中最为重要的内容之递归,对以往内容感兴趣的同学可以查看下面: python数据类型: python数据结构:数据类型. python的输入输出: python数据结构之输入输出.控制和异常. python面向对象: python数据结构之面向对象. python算法分析: python数据结构算法分析. python数据结构之栈.队列和双端队列 递归是在进行重复性工作中经常考到的问题,非常值得学习.

  • python对象及面向对象技术详解

    本文实例讲述了python对象及面向对象技术.分享给大家供大家参考,具体如下: 1 先看一个例子. 本章将讲解这个例子程序: 文件: fileinfo.py: """Framework for getting filetype-specific metadata. Instantiate appropriate class with filename. Returned object acts like a dictionary, with key-value pairs f

  • Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和删除等成员函数实现时需要考虑的边界条件, prepend(头部插入).pop(头部删除).append(尾部插入).pop_last(尾部删除) 2.1 插入: 空链表 链表长度为1 插入到末尾 2.2 删除 空链表 链表长度为1 删除末尾元素 (3)从单链表到单链表的一众变体: 带尾节点的单链表

  • python数据结构之栈、队列及双端队列

    目录 1.线性数据结构的定义 2.栈 2.1 栈的定义 2.2 栈的数据类型 2.3 用python实现栈 2.4 栈的应用 3. 队列 3.1 队列的定义 3.2 队列抽象数据类型 3.3 用python实现队列 3.3 队列的应用 4. 双端队列 4.1 双端队列的定义 4.2 双端队列抽象数据类型 4.3 用python实现双端队列 4.3 双端队列的应用 5.链表 5.1 链表定义 5.2 用python实现链表 前文学习: python数据类型: python数据结构:数据类型. py

  • python数据结构算法分析

    目录 1.算法分析的定义 2. 大O记法 3. 不同算法的大O记法 3.1 清点法 3.2 排序法 3.3 蛮力法 3.4 计数法 4. 列表和字典操作的复杂度 4.1 列表 4.2 字典 前文学习: python数据类型: python数据结构:数据类型. python的输入输出: python数据结构输入输出及控制和异常. python面向对象: python数据结构面向对象. 今天我们来学习的内容是面试题中都避免不小了的问题,就是算法分析了,什么是算法分析,算法分析是用来分析一个算法的好坏

  • python数据结构之搜索讲解

    目录 1. 普通搜索 2. 顺序搜索 1.1 无序下的顺序查找 1.2 有序下的顺序查找 2.二分查找 3.散列查找 3.1 几种散列函数 3.2 处理散列表冲突 3.3 散列表的实现(加1重复) 4.参考资料 往期学习: python数据类型: python数据结构:数据类型. python的输入输出: python数据结构之输入输出及控制和异常. python面向对象: python数据结构面向对象. python算法分析: python数据结构之算法分析. python栈.队列和双端队列:

  • python数据结构之图的实现方法

    本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图: A -> B     A -> C     B -> C     B -> D     C -> D     D -> C     E -> F     F -> C 可以用字典和列表来构建 graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C'], 'E': [

  • 浅谈python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个坑是如此之大,犹豫再三,还是只捡一下重要的内容来讲吧,不足的内容只能靠大家自己去补充了. 惯例声明一下,我使用的版本是 python2.7,版本之间可能存在差异. 好,在开讲之前,我们先思考一个问题,看代码: 为什么我只创建是为 a 赋值,就可以使用一些我没写过的方法? 可能会有小伙伴说:因为 a

随机推荐