IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python学习Day16 -> 正文阅读

[Python知识库]Python学习Day16

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)

>>> #定义一个新的int类 它继承于原来的int类
>>> class New_int(int):
	#重写add方法 但是调用了int中减法的魔法方法
	def __add__(self,other):
		return int.__sub__(self,other)
	#重写sub方法 但是调用了int中加法的魔法方法
	def __sub__(self,other):
		return int.__add__(self,other)

	
>>> a = New_int(3)
>>> b = New_int(5)
>>> a + b
-2
>>> a - b
8

>>> #如果不去调用int中的魔法方法
>>> 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
>>> #官方文档:如果右操作数的类型是左操作数类型的子类,并且该子类提供了操作的反射方法,则该方法将在左操作数的非反射方法之前被调用。 Nint是int的子类
>>> class Nint(int):
	def __rsub__(self,other):
		return int.__sub__(self,other)

	
>>> a = Nint(5)
>>> 3 - a
2
>>> #因为3找不到对应的__sub__()方法,所有Nint类中的__rsub__()传入了a 最后是a - 3

一元操作符

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
    #a以字符串形式输出
    
    >>> 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 = '总共运行了'
        #因为localtime返回的是一个时间元组的结构 
        #有六个结构:年 月 日 时 分 秒
        #用for循环将这六个元素逐一地去迭代相减
        #再将它们的差值逐一添加到列表中去
        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

    #这个操作是将str复制到repr中
    __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 = []
        #注意:如果这里用了start和stop就会出现属性名与方法名相同 属性覆盖方法的问题
        self.begin = 0
        self.end = 0


    
    def __str__(self):
        return self.prompt

    #这个操作是将str复制到repr中
    __repr__ = __str__


    def __add__(self,other):
        #这里没有用self.prompt 因为prompt在此处只要作为局部变量就行
        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])
            #当某个单位前数字为0时就不显示单位
            if self.lasted[index]:
                self.prompt += str(self.lasted[index]) + self.unit[index]

            #为下一轮计时初始化变量
            self.begin = 0
            self.end = 0

   
    
    

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:50:39  更:2021-09-03 11:51:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:18:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码