(董付国)Python 学习笔记---Python面向对象程序设计(3)

2023-11-08

6.4.2 案例精选

  • 例6-1:自定义数组。在MyArray.py文件中,定义了一个数组类,重写了一部分特殊方法以支持数组之间、数组与整数之间的四则运算以及内积、大小比较、成员测试和元素访问等运算符。
class MyArray:                                              # 在内部封装/隐藏了一个列表
    '''All the elements in this array must be numbers'''

    def __IsNumber(self,n):                                 #定义了一个私有的成员方法
        return isinstance(n,(int,float,complex))

    def __init__(self,*args):                               #类的构造方法,‘*’可变长度参数
        if not args:
            self.__value = []                               #如果传值不是int,float,complex则给个空列表包装成数组
        else:
            for arg in args:
                if not self.__IsNumber(arg):
                    print('All elements must be numbers')
                    return
                self.__value = list(args)

    #重载运算符+
    #数组中每个元素都与数字n相加,或两个数组相加,返回新数组
    def __add__(self,n):
        if self.__IsNumber(n):
            #数组中所有元素都与数字n相加
            b = MyArray()                                   #构建一个空数组
            b.__value = [item+n for item in self.__value]   #列表推导式
            return b
        elif isinstance(n,MyArray):                         #MyArray是一个数组类型
            if len(n.__value) == len(self.__value):
                c = MyArray()
                c.__value = [i+j for i,j in zip(self.__value,n.__value)]
                return c
            else:
                print('Length not equal')
        else:
            print('Not supported')

    #重载运算符-
    #数组中每个元素都与数字n相减,返回新数组
    def __sub__(self,n):
        if not self.__IsNumber(n):
            #减法对于n的类型和数字类型之间不支持操作
            print('- operating with ',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item-n for item in self.__value]
        return b

    #重载运算符*
    #数组中每个元素都与数字n相乘,返回新数组
    def __mul__(self,n):
        if not self.__IsNumber(n):
            #乘法对于n的类型和数字类型之间不支持操作
            print('* operating with ',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item*n for item in self.__value]
        return b
    
    #重载运算符/
    #数组中每个元素都数字n相除,返回新数组
    def __truediv__(self,n):
        if not self.__value(n):
            #除法对于n的类型和数字不支持操作
            print(r'/ operating with',type(n),'and number is not supported.')
            return
        b = MyArray()
        b.__value = [item/n for item in self.__value]
        return b

    #重载运算符//
    #数组中每个元素都与数字n整除,返回新数组
    def __floordiv__(self,n):
        if not isinstance(n,int):
            print(n,' in not an integer')
            return
        b = MyArray()
        b.__value = [item//n for item in self.__value]

    #重载运算符%
    #数组中每个元素都数字n求余数,返回新数组
    def __mod__(self,n):
        if not self.__value(n):
            print(r'% operating with',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item%n for item in self.__value]
        return b

    #重载运算符**
    #数组中每个元素都数字n求幂运算,返回新数组
    def __pow__(self,n):
        if not self.__value(n):
            print(r'** operating with',type(n),'and number type is not supported.')
            return
        b = MyArray()
        b.__value = [item**n for item in self.__value]
        return b

    def __len__(self):
        return len(self.__value)

    #直接使用该对象作为表达式来查看对象的值
    def __repr__(self):
        return repr(self.__value)

    #支持使用print()查看对象的值
    def __str(self):
        return str(self.__value)

    #追加元素
    def append(self,v):
        assert self.__IsNumber(v),'Only number can be appended.'        #如果v满足条件则返回数组,否则抛出异常

    #获取指定下标的元素值,支持使用列表或元组指定多个下标
    def __getitem__(self,index):
        length = len(self.__value)
        #如果指定单个整数作为下标,直接返回元素值
        if isinstance(index,int) and 0<=index<=length:
            return self.__value[index]
        elif isinstance(index,(list,tuple)):
            for i in index:
                if not (isinstance(i,int) and 0<=i<=length):
                    return 'index error'
            result = []
            for item in index:
                result.append(self.__value[item])
            return result
        else:
            return 'index error'

    #修改元素值,支持使用列表或元组指定多个下标,同时修改多个元素值
    def __setitem__(self,index,value):
        length = len(self.__value)
        #如果下标合法,则直接修改元素
        if isinstance(index,int) and 0<=index<=length:
            self.__value[index] = value
        #支持使用列表或元组指定多个下标
        elif isinstance(index,(list,tuple)):
            for i in index:
                if not isinstance((i,int) and 0<=i<=length):
                    raise Exception('index error')
                #如果下标和给的值都是元组或列表,并且个数一样,则分别为多个下标的元素修改值
                if isinstance(value,(list,tuple)):
                    if len(index) == len(value):
                        for i,v in enumerate(index):
                            self.__value[v] = value[i]
                    else:
                        raise Exception('value and index must be of the same length')
                #如果指定多个下标和一个普通值,则把多个元素修改为相同的值
                elif isinstance(value,(int,float,complex)):
                    for i in index:
                        self.__value[i] = value
                else:
                    raise Exception('value error')
        else:
            raise Exception('index error')

    #支持成员测试运算符in,测试数组中是否包含某个元素
    def __contains__(self,v):
        return v in self.__value

    #模拟向量内积
    def dot(self,v):
        if not isinstance(v,MyArray):
            print(v,' must be an instance of MyArray.')
            return
        if len(v) != len(self.__value):
            print('The size must be equal.')
            return
        return sum([i*j for i,j in zip(self.__value,v.__value)])

    #重载运算符==,测试两个数组是否相等
    def __eq__(self,v):
        assert isinstance(v,MyArray),'wrong type'
        return self.__value == v.__value

    #重载运算符<,比较两个数组大小
    def __lt__(self,v):
        assert isinstance(v,MyArray),'wrong type'
        return self.__value < v.__value

if __name__ == '__main__':
    print('Please use me as a module.')


    





            
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(董付国)Python 学习笔记---Python面向对象程序设计(3) 的相关文章

  • numpy的numpy.delete()/insert()/append()函数

    1 numpy delete arr obj axis None arr 输入向量 obj 表明哪一个子向量应该被移除 可以为整数或一个int型的向量 axis 表明删除哪个轴的子向量 若默认 则返回一个被拉平的向量 a np array
  • Python学习笔记(六):数据类型之 List

    序列是 python 中最基本的数据类型 序列中的每个元素都分配一个索引 索引从 0 开始 python 有六个序列的内置类型 最常见的是列表和元祖 序列都可以进行的操作 包括索引 切片 加 乘 检查成员 此外 python 已经内置确定序
  • Python语言:列表初体验

    列表是Python中的一个对象 他类似于C语言中的数组 可以存储许多数据 也可以称之为数据集合 他原则是可以存储不同类型的数据 一般不建议这样使用 有点奇怪 一般情况下一个列表中保存的都是同一种类型的数据 列表的创建 列表 list 是把数
  • python学习——Python2与Python3共存

    上篇 https blog csdn net qq 42489308 article details 97644669 困扰 最近被一个问题困扰了很久 就是Python2和Python3共存pip的使用问题 本来是一个很简单的问题 但是我的
  • python判断一个集合是否为另一个集合的子集

    a 1 2 3 4 b set 1 2 b issubset a
  • Python常用第三方库——简介及下载地址

    Python常用第三方库 可以在 The Python Package Index PyPI 软件库 官网主页 https pypi org 查询 下载 和 发布 Python包或库 网络爬虫 requests https pypi org
  • Numpy&Pandas 数据处理与挖掘

    笔记来源B站 https www bilibili com video BV1xt411v7z9 p 21 python学习笔记 1 Numpy 1 1 Numpy优势 1 1 1 Numpy介绍 1 1 2 ndarray介绍 1 1 3
  • Python3-excel文档操作(二):利用openpyxl库处理excel表格:在excel表格中插入图片

    1 简介 excel表中可以插入图片 使用openpyxl库可以实现这个功能 2 代码 coding utf 8 import os import sys import time import openpyxl from openpyxl
  • python学习——如何求质数/素数

    质数判断 方法一 一个大于1的自然数 除了1和它本身外 不能被其他自然数 质数 整除 2 3 5 7等 换句话说就是该数除了1和它本身以外不再有其他的因数 也就是说 从2到n 1遍历 如果存在一个数是这个整数n的因数 那么它就不是质数 但是
  • Python爬虫之正则表达式

    正则表达式 正则表达式就是规则表达式 在接触爬虫前 正则表达式就是用来过滤的 接触爬虫后发现真的就是过滤用的hhh 正则表达式在爬虫中的作用就是过滤出想要的字符 然后获取 如果不用正则表达式 那么就会将网页中大量信息全部爬出 造成大量内存浪
  • Python反转输出正整数

    题目 获得输入正整数 N 反转输出该正整数 不考虑异常情况 输入格式 输入一个正整数 输出格式 输出一个正整数 疑问 为什么我的两个答案都没通过Python二级在线评阅的测试 我
  • UI自动化-显示等待与隐式等待

    直接等待 强制等待 线程休眠一定时间 time sleep sec 隐式等待 设置一个等待时间 轮询查找 默认0 5s 元素是否出现 如果没有出现就抛出异常 self driver implicitly wait 3 这是一个全局的隐式等待
  • 爬虫获取电影数据----以沈腾参演电影为例

    数据可视化 分析实战 1 1 沈腾参演电影数据获取 1 2 电影数据可视化分析 文章目录 数据可视化 分析实战 前言 1 网页分析 2 构建数据获取函数 2 1 网页数据获取函数 2 2 网页照片获取函数 3 获取参演影视作品基本数据 4
  • Python语言:求水仙花数案例讲解

    求水仙花数是循环和判断语句相结合的一个经典案例 思路分析 通过循环遍历100到999之间的数字然后根据他们的个位 十位 百位上的数字立方和是否为他本身来判断分析得出什么数是水仙花数 1 如何循环遍历100到999的所有数字 使用while循
  • python学习笔记—— socket编程

    上篇 https blog csdn net qq 42489308 article details 89388112 socket编程 什么是socket 简称套接字 是进程间通信的一种方式 它与其他进程间通信的一个主要不同是 它能实现不
  • 【Python_PySide2学习笔记(一)】PySide2动态加载UI方式,重写关闭窗体事件

    PySide2设置关闭提示窗口 动态加载UI方式 重写关闭窗体事件 前言 转载 https blog csdn net qq 44703282 article details 119830807 在此链接中介绍了两种重写关闭提示窗体事件的方
  • DataFrame添加列名,查看均值等,seaborn

    查看数据 seaborn画图简单好看 看两两特征的关系 对角线是自己和自己 dropna 处理缺失值
  • 使用python对光谱数据进行lorentz峰值拟合(bounds限定拟合参数范围)

    1 lorentz峰值拟合 发光光谱是一种用于表征二维半导体材料光学性质的重要技术 它可以反映出材料中的载流子密度 缺陷态 激子束缚能等信息 由于二维半导体材料的厚度极其薄 其发光信号往往很弱 且受到基底 环境和测量设备等因素的干扰 因此需
  • 项目中:Json文件的读取

    项目中 Json文件的读取 读Json文件 取Json文件中内容 举例 举例 Json文件内容如下 Flickr8k images sentids 39300 39301 39302 39303 39304 imgid 7860 sente
  • Python3学习笔记之-第三方模块(Pillow)

    目录 前言 一 安装Pillow 二 操作图像 前言 在 pillow之前处理图形的库莫过于PIL 但是它支持到python2 7 年久失修 于是一群志愿者在PIL的基础上常见了pillow 支持python3 又丰富和功能特性 一 安装P

随机推荐