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