Python学习Day16
算术运算
当你的对象进行相关的运算操作时,就会自动触发相应的魔法方法
魔法方法 | 含义 |
---|
_ _ add _ _(self,other) | 定义加法的行为:+ | _ _ sub _ _(self,other) | 定义减法的行为:- | _ _ mul _ _(self,other) | 定义乘法的行为:* | _ _ truediv _ _(self,other) | 定义真除法(两数相除得一小数)的行为:/ | _ _ floordiv _ _(self,other) | 定义整数除法(地板除)的行为:// | _ _ mod _ _(self,other) | 定义取模算法的行为:% | _ _ divmod _ _(self,other) | 定义当被divmod()调用时的行为 | _ _ pow _ _(self,other,[,modulo]) | 调用当被power()调用或**运算时的行为 | _ _ lshift _ _(self,other) | 定义按位左移位的行为:<< | _ _ rshift _ _(self,other) | 定义按位右移位的行为:>> | _ _ and _ _(self,other) | 定义按位与操作的行为:& | _ _ xor _ _(self,other) | 定义按位异或操作的行为:^ | _ _ or _ _(self,other) | 定义按位或操作的行为:| |
divmod(a,b)返回的值时一个元组,(a//b,a%b)
>>>
>>> class New_int(int):
def __add__(self,other):
return int.__sub__(self,other)
def __sub__(self,other):
return int.__add__(self,other)
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b
-2
>>> a - b
8
>>>
>>> class Try_int(int):
def __add__(self,other):
return self + other
def __sub__(self,other):
return self - other
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b
下面会出现无限递归
>>>
>>> class Try_int(int):
def __add__(self,other):
return int(self) + int(other)
def __sub__(self,other):
return int(self) - int(other)
>>> a = Try_int(3)
>>> b = Try_int(5)
>>> a + b
8
反运算
python反运算
如果a对象作为加数在_ _add _ _()方法没有实现或者不支持相应的操作,那么Python就会自动调用b的 _ _radd _ _()
>>> class Nint(int):
def __radd__(self,other):
return int.__sub__(self,other)
>>> a = Nint(5)
>>> b = Nint(3)
>>> a + b
8
>>> 1 + b
2
>>>
>>> class Nint(int):
def __rsub__(self,other):
return int.__sub__(self,other)
>>> a = Nint(5)
>>> 3 - a
2
>>>
一元操作符
python支持的一元操作符
一元操作符 | 含义 |
---|
_ _ neg _ _(self) | 定义正号的行为:+x | _ _ pos _ _(self) | 定义负号的行为:-x | _ _ abs _ _(self) | 定义当被abs()调用时的行为 | _ _ invert _ _(self) | 定义按位求反的行为:~x |
简单定制
基本要求:
- 定制一个计时器的类
- start和stop方法代表启动计时器和停止计时器
- 假设计时器对象t1,print(t1)和直接调用t1均显示结果
- 当计时器未启动或已经停止时,调用stop方法会给予温馨提示
- 两个计时器的对象可以进行相加:t1 + t2
- 只能使用提供的有限资源完成
有限的资源:
-
使用time模块的localtime方法获取时间 time模块详解 -
time.localtime返回struct_time的时间格式 -
_ _ str _ _ ()和 _ _ repr _ _ ()魔法方法 两种方法调用示例 >>> class A:
def __str__(self):
print('Python')
>>> a = A()
>>> print(a)
Python
>>> class B:
def __repr__(self):
return 'Python'
>>> a
<__main__.A object at 0x000001A460106A60>
>>> b = B()
>>> b
Python
import time as t
class MyTimer():
def start(self):
self.start = t.localtime()
print('计时开始...')
def stop(self):
self.stop = t.localtime()
self._calc()
print('计时结束!')
def _calc(self):
self.lasted = []
self.prompt = '总共运行了'
for index in range(6):
self.lasted.append(self.stop[index] - self.start[index])
self.prompt += str(self.lasted[index])
print(self.prompt)
交互界面:
>>> t1 = MyTimer()
>>> t1.start()
计时开始...
>>> t1.stop()
总共运行了000007
计时结束!
此时已经基本实现了计时功能,接下来需要完成“print(t1)和直接调用t1均显示结果”的操作,那就要通过重写提示中的两个魔法方法来实现
def __str__(self):
return self.prompt
__repr__ = __str__
>>> t1 = MyTimer()
>>> t1.start()
计时开始...
>>> t1.stop()
总共运行了000002
计时结束!
>>> t1
总共运行了000002
>>> print(t1)
总共运行了000002
最后,再重写一个_ _ add_ _()方法,让两个计时器对象相加会自动返回时间的和
最终代码:
import time as t
class MyTimer():
def __init__(self):
self.unit = ['年','月','日','时','分','秒']
self.prompt = '未开始计时'
self.lasted = []
self.begin = 0
self.end = 0
def __str__(self):
return self.prompt
__repr__ = __str__
def __add__(self,other):
prompt = '总共运行了'
result = []
for index in range(6):
result.append(self.lasted[index] + other.lasted[index])
if self.result[index]:
prompt += (str(self.result[index]) + self.unit[index])
return prompt
def start(self):
self.begin = t.localtime()
self.prompt = '请先调用stop停止计时'
print('计时开始...')
def stop(self):
if not self.begin:
print('请先调用start()停止计时!')
else:
self.end = t.localtime()
self._calc()
print('计时结束!')
def _calc(self):
self.lasted = []
self.prompt = '总共运行了'
for index in range(6):
self.lasted.append(self.end[index] - self.begin[index])
if self.lasted[index]:
self.prompt += str(self.lasted[index]) + self.unit[index]
self.begin = 0
self.end = 0
|