Python学习——Day12

news2025/4/6 10:48:45

目录

一、实例方法、类方法、静态方法

1.1实例方法

1.2类方法

1.3静态方法

1.4实例

二、 __slots__

三、错误和异常

3.1语法错误

3.2异常

 3.3异常处理


一、实例方法、类方法、静态方法

1.1实例方法

实例方法入参第一个值,默认self指代当前调用的对象,不建议使用其它关键字代替,实例方法只能由实例对象进行调用,个人理解由于需要明确是哪个对象在使用当前方法所以实例方法与静态方法和类方法不同对调用者要求严格

1.2类方法

类方法与静态方法类似需要一个关键词进行装饰@classmethod且方法入参第一个值默认为cls。类方法可以通过实例对象和类对象进行调用,要在初始化前做一些校验的工作时可以考虑使用类方法,比如:在写入excel数据前,需要校验文件是否打开,那这个验证的方法即可以使用类方法实现

1.3静态方法

静态方法使用的关键字是@staticmethod,通过在方法前追加此装饰器该方法就属于一个静态方法,静态方法个人理解为它既不依赖实例对象也不依赖于类,它只是需要一个载体即可,所以无论是通过类对象直接调用还是实例对象进行调用都是可以的,需要注意的是在静态方法中无法使用实例属性和方法。所以在日常过程中如果有一个方法实现的功能比较独立的时候就可以考虑使用静态方法实现

1.4实例

class A():

    classAttribute ='monica'
    def __init__(self,example_name):
        self.example_name = example_name
    @staticmethod
    def testStatic():
        print('静态方法使用')
        print('调用类属性',A.classAttribute)
        print('调用实例属性',self.example_name)
    def testExample(self):
        print('实例方法')
        print('调用实例属性:',self.example_name)
        print('调用类属性:',testFunction.classAttribute)
    @classmethod
    def testClassMethod(cls):
        print('类方法')
        print('调用类属性:',cls.classAttribute)
        print('调用实例属性:',cls.example_name)
if __name__ == '__main__':
    tf = A('example_monica')
    #实例对象调用静态方法
    tf.testStatic()
    #类对象调用静态方法
    A.testStatic()
    #实例对象调用方法
    tf.testExample()
    #类对象调用实例方法
    A.testExample('test')
    #实例对象调用类方法
    tf.testClassMethod()
    #类对象调用类方法
    A.testClassMethod()

二、 __slots__

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

p = Point()
p.z = 1

       上例构造了一个 Point 类,自带属性 x 和 y。实例化 Point 类对象后,实例 p 虽然本无属性 z,但通过 p.z = 1 的赋值操作却可直接将属性 z 添加至实例 p 中。

        这种机制虽然很看起来灵活,但实则存在隐患。因为 用户具有随意添加属性的权限时,可能导致未知的问题,特别是面对复杂系统时。故 有时出于严谨与安全考量,并不希望用户能够随意动态修改。这时,__slots__ 方法应运而生,例如:

class Point_new:
    __slots__ = ['x', 'y']  # 限制使用

    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

q = Point_new()
q.z = 1

报错:

Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    q.z = 1
AttributeError: 'Point_new' object has no attribute 'z'

        由上例可知,类定义时在构造函数前经过 __slow__ 声明后,实例只能使用关键字 __slots__ 中定义或声明的属性 (数据成员) x 和 y。而原本就不存在于类 Point_new 的属性 z,实例 q 无法再通过赋值的方式动态创建。换言之,对实例属性而言,类属性是只读的,不可以通过实例对实例属性进行增删改

      从而, __slots_ _ 的一个用途是:限制用户随意动态修改成员

      此外,__slots__ 的另一个功能是:减少内存消耗,提升属性访问速度

三、错误和异常

3.1语法错误

3.2异常

         Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

>>> 10 * (1/0)             # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3             # spam 未定义,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2               # int 不能与 str 相加,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

3.3异常处理

3.2.1try/except

   异常捕捉可以使用 try/except 语句

实例:让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。

while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

3.2.2try 语句工作方式

  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
  • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
  • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise
针对 不同类型的异常,做出不同的响应,这时需要捕获错误类型

语法:
try:
    尝试执行的代码
    pass
except 错误类型1:
    针对错误类型1,对应的代码处理
    pass
except (错误类型2,错误类型3):
    针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    print("未知错误 %s" % result)

捕获未知错误:开发时,要预判到所有可能出现的错误,是有一定难度的
如果希望程序无论出现任何错误,都不会因为 python 解释器抛出异常而被终止,可以再增加一个 except
当 python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型

3.2.3 实例

try:
    num = int(input("输入一个整数:"))  # 输入可能为字母
    result = 8 / num  # 除数不能为0
    print(result)

#ZeroDivisionError  是 Python 的内置异常类型,它是 Exception 类的一个子类
except ZeroDivisionError:  
    print("除0错误,输入的数不能为0")
except ValueError:
    print("值错误,请输入正确的整数")

3.2.3 try/except...else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
  • 使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。
  • 异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常

3.4 try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码

实例:

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

3.5抛出异常

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]

实例:如果 x 大于 5 就触发异常

x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

执行以上代码会触发异常:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

3.6用户自定义异常

可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

# 定义一个自定义异常类 MyError,继承自 Exception 类
class MyError(Exception):
    # 初始化方法,接收一个参数 value,并将其赋值给实例变量 self.value
    def __init__(self, value):
        self.value = value

    # 字符串表示方法,返回实例变量 self.value 的字符串表示
    def __str__(self):
        return repr(self.value)

# 尝试执行以下代码块
try:
    # 抛出一个自定义异常 MyError,传入参数 2*2,即 4
    raise MyError(2*2)
except MyError as e:
    # 捕获自定义异常 MyError,并将异常实例赋值给变量 e
    # 打印异常信息,包括异常实例的 value 属性
    print('My exception occurred, value:', e.value)

3.7异常捕获 

3.7.1完整语法

try:
    尝试执行的代码
    pass
except 错误类型1:
    针对错误类型1,对应的代码处理
    pass
except (错误类型2,错误类型3):
    针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    打印错误信息
    print("未知错误 %s" % result)
else:
    没有异常才会执行的代码
    pass
finally:
    无论是否有异常,都会执行的代码
    print("无论是否有异常,都会执行的代码")

3.7.2实例

try:
    num = int(input("输入一个整数:"))  # 输入可能为字母
    result = 8 / num  # 除数不能为0
    print(result)
 
# except ZeroDivisionError:
#     print("除0错误,输入的数不能为0")
except ValueError:
    print("值错误,请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功")
finally:
    print("无论是否有异常,都会执行的代码")

运行结果:

输入字母:

输入0:

输入数字:

 参考:

​​​​​​【精选】Python学习——捕获异常_neckprotecter的博客-CSDN博客

 Python3 错误和异常 | 菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字转型下的保险业:可视化大屏的光明未来

在当今不确定性充斥的世界中&#xff0c;保险行业扮演着关键的社会角色。无论是财产保险、健康保险还是生命保险&#xff0c;它们都提供了一种安全网&#xff0c;帮助个人和企业在不可预测的风险面前保护自己。然而&#xff0c;随着信息时代的来临&#xff0c;数据变得愈发重要…

FreeRTOS系统下看门狗定时器的使用总结

文章目录 前言定时器分类何为看门狗定时器 系统复位系统级看门狗SWDT的使用1.看门狗配置2、独立监测多任务方式 前言 本文记录自己使用看门狗定时器的过程&#xff0c;起因是系统不知名原因总是跑挂&#xff0c;查了很久找不到原因&#xff08;排除了变量溢出、中断冲突等&…

解决找不到vcruntime140.dll无法执行代码的方法分享

在我们用电脑的过程中&#xff0c;总免不了碰到些问题&#xff0c;比如“找不到vcruntime140.dll”。这通常是我们在运行某些软件的时候&#xff0c;电脑找不到它需要的一个叫动态链接库的文件。这个问题有很多原因&#xff0c;比如软件安装的时候出了问题&#xff0c;系统文件…

2023上海初中生古诗文大会初选将于11月5日开始,划重点来了

好消息&#xff01; 根据主办方通知&#xff0c;2023年上海市中学生古诗文大会&#xff08;初中组&#xff09;&#xff0c;以下简称初中生古诗文大会&#xff0c;初选将于11月5日开始。 有许多家长和初中同学关心&#xff0c;初中生古诗文大会如何参加&#xff1f;考多长时间…

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库

Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库安装 IndexDB类库引入 localForage测试 新增数据、获取数据 Vue使用 IndexDB vue操作IndexDB数据库 Vue操作IndexDB数据库 大部分场景使用 LocalStore都…

Windows域控制器的部署以及加入

域控制器&#xff1a;Windows Server 2022 域内主机&#xff1a;Windows7、Windows Server 2008 R2 安装部署预控 服务器管理器-添加角色和功能&#xff0c;一路下一步&#xff0c;到“服务器角色”&#xff0c;勾选“Active Directory 域服务”&#xff0c;一路下一步直到安…

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务&#xff0c;有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案&#xff0c;该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 什么是 S…

基于SpringBoot+Vue实现前后端分离的房屋租赁系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

ARL灯塔安装与使用

ARL灯塔安装与使用 1. 系统要求2. ARL灯塔安装2.1. docker环境安装2.1.1. 更新yum包2.1.2. 卸载老版docker2.1.3. 安装docker所需要的依赖包2.1.4. 设置yum源2.1.5. 查看仓库中docker版本2.1.6. 安装docker最新版2.1.7. docker设置2.1.8. docker其它命令 2.2. 安装docker-compo…

世微 60V高端电流采样降压恒流驱动IC LED电源驱动器AP51656

1产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED输入电压范围从 5 V 到 60V&#xff0c;输出电流 最大可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端…

ModelMapper

ModelMapper用于将视图对象和实体类进行转换。 依赖&#xff1a; 单例模式&#xff1a; API控制器&#xff1a; 使用&#xff1a;

Mac电脑矢量编辑必备:Sketch 最新中文 for mac

Sketch是一款专门为Mac设计的矢量图形绘制软件&#xff0c;广泛应用于UI/UX设计领域。它拥有丰富的设计工具和功能&#xff0c;使得设计师可以轻松创建高质量的界面设计和交互原型。Sketch基于矢量图形&#xff0c;可以无损放大和缩小&#xff0c;保证设计的清晰度和质量。它还…

Linux的简介和环境搭建

简介 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个…

【前端早早聊直播回顾】Harmony Next 与 Flutter 的不解之缘

Hello 大家好&#xff0c;我是 Flutter GDE 郭树煜&#xff0c;本次要分享的话题是关于鸿蒙与 Flutter 的故事&#xff0c;可能没接触过的会感觉有点懵&#xff0c;Harmony 和 Flutter 有啥关系&#xff0c;它们怎么会被放到一起讲了呢&#xff1f;接下来就让我们来聊聊这个问题…

AMEYA360:类比半导体重磅发布车规级智能高边驱动HD7xxxQ系列

致力于提供高品质芯片的国内优秀模拟及数模混合芯片设计商上海类比半导体技术有限公司(下称“类比半导体”或“类比”)宣布推出重磅新品车规级智能高边驱动HD7xxxQ系列。该系列产品包括车规级单通道高边驱动HD70xxQ和车规级双通道智能高边驱动HD70xx2Q&#xff0c;提供不同通道…

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…

损失函数总结(十):TripletMarginLoss、TripletMarginWithDistanceLoss

损失函数总结&#xff08;十&#xff09;&#xff1a;TripletMarginLoss、TripletMarginWithDistanceLoss 1 引言2 损失函数2.1 TripletMarginLoss2.2 TripletMarginWithDistanceLoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、…

腾讯云轻量应用服务器“镜像”选择和“镜像类型”说明

腾讯云轻量应用服务器镜像是什么&#xff1f;镜像就是操作系统&#xff0c;轻量服务器镜像系统怎么选择&#xff1f;如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版&#xff0c;镜像系统根据实际使用来选择&#xff0c;腾讯云百科来详细说下腾讯…

HTML标签、CSS介绍

标签的分类: 块级/行内 # 块级标签: 独占一行 h1~h6 p div """ 块儿级标签可以修改长宽. 行内标签不可以, 就算修改了也不会变化.块级标签内部可以嵌套任意的块级标签和行内标签. 特例: 是p标签虽然是块级标签 但是它只能嵌套行内标签 不能嵌套块级标签. 如…

1月18-19日|2024中国亚洲鞋业国际峰会

2024中国&亚洲鞋业国际峰会 2024年1月18-19&#xff0c;上海 主办方&#xff1a;ECV International 峰会背景 在全球时尚产业减排的关键期&#xff0c;作为仅次于石化工业的第二大污染产业&#xff0c;时尚行业的绿色生产迫在眉睫。一直以来&#xff0c;制鞋行业都是环境…