【复试 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

 

 

 

 

 

posted @ 2020-03-20 23:48  douzujun  阅读(271)  评论(0编辑  收藏  举报