zoukankan      html  css  js  c++  java
  • 【复试 python程序设计 第2版 董付国】python特殊方法与运算符重载

    1. 实例方法

    1.1 __add__(self, n)

    # -*- coding: utf-8 -*-
    
    # 数组类,支持数组与数字之间的四则运算
    # 数组之间的 加法运算,内积运算和大小比较
    # 数组元素访问和修改 
    # 成员测试
    class MyArray:
        __value = []
        __size = 0
        
        # 判断是否是数字
        def __IsNumber(self, n):
            if (not isinstance(n, int)) and 
               (not isinstance(n, float)) and 
               (not isinstance(n, complex)):
                   return False
            else:
                return True
              
        # 初始化
        def __init__(self, *args):
            if not args:
                self.__value = []
            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):
                b = MyArray()
                for v in self.__value:
                    b.__value.append(v + n)
                return b
            elif isinstance(n, MyArray):
                if len(n.__value) == len(self.__value):
                    c = MyArray()
                    for i, j in zip(self.__value, n.__value):
                        c.__value.append(i + j)
                    return c
                else:
                    print('Length not equal')
            else:
                print('Not supported')

    1.2 __sub__

        def __sub__(self, n):
            if not self.__IsNumber(n):
                print("not number")
                return
            b = MyArray()
            for v in self.__value:
                b.__value.append(v - n)
            return b

    1.3 __repr__:可直接输出对象[区别__str__)

     如果没有写这个函数:

        # 直接使用对象作为语句时调用该函数
        def __repr__(self):
            return repr(self.__value)

    1.4 __str__:可直接输出对象

    def __str__(self):
    return str(self.__value)

    2. 综合

    # -*- coding: utf-8 -*-
    
    # 数组类,支持数组与数字之间的四则运算
    # 数组之间的 加法运算,内积运算和大小比较
    # 数组元素访问和修改 
    # 成员测试
    class MyArray:
        __value = []
        __size = 0
        
        # 判断是否是数字
        def __IsNumber(self, n):
            if (not isinstance(n, int)) and 
               (not isinstance(n, float)) and 
               (not isinstance(n, complex)):
                   return False
            else:
                return True
              
        # 初始化
        def __init__(self, *args):
            if not args:
                self.__value = []
            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):
                b = MyArray()
                for v in self.__value:
                    b.__value.append(v + n)
                return b
            elif isinstance(n, MyArray):
                if len(n.__value) == len(self.__value):
                    c = MyArray()
                    for i, j in zip(self.__value, n.__value):
                        c.__value.append(i + j)
                    return c
                else:
                    print('Length not equal')
            else:
                print('Not supported')
                
        # 数组中每个元素都与数字n相减,返回新数组
        def __sub__(self, n):
            if not self.__IsNumber(n):
                print("not number")
                return
            b = MyArray()
            for v in self.__value:
                b.__value.append(v - n)
            return b
        
        # 数组中每个元素都与数字n相乘
        def __mul__(self, n):
            if not self.__IsNumber(n):
                print("not number")
                return 
            b = MyArray()
            for v in self.__value:
                b.__value.append(v * n)
            return b
        
        # 数组中每个元素都与数字n相除,返回新数组
        def __truediv__(self, n):
            if not self.__IsNumber(n):
                print("Not number")
                return
            b = MyArray()
            for v in self.__value:
                b.__value.append(v / n)
            return b
        
        # 整除
        def __floordiv__(self, n):
            if not self.__IsNumber(n):
                print("Not number")
                return
            b = MyArray()
            for v in self.__value:
                b.__value.append(v // n)
            return b
            
        # 取余
        def __mod__(self, n):
            if not self.__IsNumber(n):
                print("Not number")
                return
            b = MyArray()
            for v in self.__value:
                b.__value.append(v % n)
            return b
        
        # 求长度
        def __len__(self):
            return len(self.__value)
        
        # 追加元素
        def append(self, v):
            if not self.__IsNumber(v):
                print("Not number")
                return
            self.__value.append(v)
            
        # 获取指引位置的元素值
        def __getitem__(self, index):
            if self.__IsNumber(index) and 0 <= index < len(self.__value):
                return self.__value[index]
            else:
                print("Index out of range.")
            
        # 设置指定位置的元素值
        def __setitem__(self, index, v):
            if not self.__IsNumber(v):
                print(v, ' is not a number')
            elif (not isinstance(index, int)) or index < 0 or index >= len(self.__value):
                print("Index type error or out of range")
            else:
                self.__value[index] = v
                
        # ==
        def __eq__(self, v):
            if not isinstance(v, MyArray):
                print(v, ' must be an instance of MyArray.')
                return False
            if self.__value == v.__value:
                return True
            return False
        
        # <
        def __lt__(self, v):
            if not isinstance(v, MyArray):
                print(v, ' must be an instance of MyArray.')
                return False
            if self.__value < v.__value:
                return True
            return False
        
        # 直接使用对象作为语句时调用该函数
        def __repr__(self):
            return repr(self.__value)
        
        # print()函数输出对象时,调用该函数
        def __str__(self):
            return str(self.__value)
        
    if __name__=='__main__':
        x = MyArray(1,2,3,4,5,6)
        y = MyArray(6,5,4,3,2,1)
        print(x + 1)
        print(x + y)
        print(x - 5)
        
        print(x * 3)
        
        x.append(7)
        print(x)
        
        x[1] = 999
        print(x[1])
        print(x)
    
        print(x // 2)       
        
        print(x < y)

    输出:

    [2, 3, 4, 5, 6, 7]
    [7, 7, 7, 7, 7, 7]
    [-4, -3, -2, -1, 0, 1]
    [3, 6, 9, 12, 15, 18]
    [1, 2, 3, 4, 5, 6, 7]
    999
    [1, 999, 3, 4, 5, 6, 7]
    [0, 499, 1, 2, 2, 3, 3]
    True

  • 相关阅读:
    基于centOS7→nginx安装
    基于centOS7→tomcat安装配置
    chmod、acl权限
    解决终端SSH连接服务器一段时间不操作之后卡死的问题
    客户端加域失败,提示“找不到网络名”解决的方案
    将博客搬至CSDN
    Qt on android 蓝牙开发(控制小车)
    qt程序运行时的错误error:undefined reference to `_imp___ZN10QTcpSocketD1Ev'
    QT 实现在QLabel上画图
    linux文件访问权限(像rw-r--rw-是什么意思)
  • 原文地址:https://www.cnblogs.com/douzujun/p/12535830.html
Copyright © 2011-2022 走看看