Python之面向对象重载(03)

发布时间:2021-12-03 公开文章

I am not a designer nor a coder. I'm just a guy with a point-of-view and a computer.

筑基<融合<元婴<分神<渡劫<大乘
 

 

 


 

重载方法add()、sub()

#重载方法__add__()、__sub__()

class Arithm:
   def __init__(self, num):
      self.value = num      

   def __add__(self, num): #相加
      return Arithm(self.value + num)

   def __sub__(self, num): #相减
      return Arithm(self.value - num)

one = Arithm(255)
result = one + 20
print('相加:', result.value)
result = one - 144
print('相减:', result.value)
相加: 275
相减: 111
#重载运算符 __add__(),'+'左侧操作数必须是对象

class Increase: #定义类
    def __init__(self, num = 0):#初始化对象
        self.value = num
    def __add__(self, num):#两数相加
        return self.value + num

n1 = int(input('Input Numbers:'))
# Increase.__init__(one, n1)
number = Increase(n1)
print(n1, '+ 12 = ', number + 12)
#print('12 + ', n1, '=', 12 + number)#会有错误
Input Numbers:1
1 + 12 =  13
'''
   重载运算符 __add__(),'+'左侧操作数必须是对象
   重载运算符 __radd__(), '+'左侧操作数可以是数值
'''

class Increase: #定义类
    def __init__(self, num = 0):#初始化对象
        self.value = num

    def __add__(self, num):#两数相加
        #print('add is {} + {}'.format(self.value, num))
        return self.value + num

    def __radd__(self, num): #允许左侧操作数是数值
        #print('radd is {} + {}'.format(self.value, num))
        return num + self.value

n1 = int(input('Input Numbers:'))
number = Increase(n1)
print(n1, '+ 12 = ', number + 12)
print('12 + ', n1, '=', 12 + number)
Input Numbers:2
2 + 12 =  14
12 +  2 = 14
'''
   重载运算符 __add__(),'+'左侧操作数必须是对象
   重载运算符 __radd__(), '+'左侧操作数可以是数值
   BIF isinstance()来判断传入的参数是否为对象
'''

class Increase: #定义类
    def __init__(self, num = 0):#初始化对象
        self.value = num

    def __add__(self, num):#两数相加
        if isinstance(num, Increase):
            num = num.value        
        return Increase(self.value + num)

    def __radd__(self, num): #允许左侧操作数是数值        
        return num + self.value        

    def __str__(self):        
        return '= %d' % self.value

n1, n2 = eval(input('Two Numbers: '))
A = Increase(n1)
B = Increase(n2)
print(n1, '+', 35, A + 35)
print(n2, '+', 127, B + 127)
Two Numbers: 1,2
1 + 35 = 36
2 + 127 = 129
#定义可原地相加的__iadd__()方法

class Increase: #定义类
    def __init__(self, num = 0):#初始化对象
        self.value = num

    def __add__(self, num):#a += b
        self.value += num        
        return self    

#创建对象
n1, n2 = eval(input('Two number:'))
A = Increase(n1)
A += n2
print('A +=', n2, '结果:', A.value)
Two number:2,3
A += 3 结果: 5
#重载运算符 __add__()和__sub__()

class Effectua1:
    def __init__(self, num): # 初始化,传入数值
        self.data = num
    def __add__(self, num):#相加, overload '+'
        #返回一个新的实例
        return Effectua1(self.data + num)
    def __sub__(self, num): #相减        
        return Effectua1(self.data - num)

n1, n2 = eval(input('Two Numbers:'))
one = Effectua1(n1) # Effectua1.__init__(one, 5)
result = one + 12 #Effectua1.__add__(one, 2)
print(n1, '+ 12 = ', result.data)
two = Effectua1(n2)
result = two - 17
print(n2, '- 17 = ', result.data)
Two Numbers:1,3
1 + 12 =  13
3 - 17 =  -14

重载比较大小

#使用__gt__()、__lt__()、__eq__()进行比较
class Comp:
    data = 743
    def __gt__(self, value):# x > y
        return self.data > value
    def __lt__(self, value): # x < y
        return self.data < value
    def __eq__(self, value): # x == y
        return self.data == value
A = Comp()
print('返回值:', A > 8865)
print('返回值', A < 253)
print('返回值', A == 743)
返回值: False
返回值 False
返回值 True
#index运算
class Group:
    def __getitem__(self, index): #重载index之值
        return index ** 2
#创建对象
it = Group()
print('Index:', it[2])
for item in range(1,4): #读取index值
    print(it[item], end = ' ')
Index: 4
1 4 9
#__getitem__() 并加人slice

class Student:
    score = [78, 56, 95, 87, 61]
    def __getitem__(self, index): #返回索引编号
        print('索引值:', index, end = ' ')
        return self.score[index]

#创建对象
Mary = Student()
print('分数:', Mary[0])
索引值: 0 分数: 78
#__getitem__()用于迭代索引

class Student():
    def __getitem__(self, k):
        return self.data[k]

#创建对象
one = Student()
one.data = 'Chicage'
print(one[1])
for item in one:
    print(item, end = ' ')
h
C h i c a g e