Python踩坑:类与类对象类型参数传递与使用
前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题。 不过,一旦用来开发稍微大型一点的项目,例如搭建一个Web应用,就会遇到一些问题,一般缺乏经验的人都会陷入某些坑中。= =... 坑 先说坑,函数参数类型是一坑,类与类的对象这又是一坑。 虽然之前用其他静态类型语言(例如C
目录3 个章节
前言
对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题。 不过,一旦用来开发稍微大型一点的项目,例如搭建一个Web应用,就会遇到一些问题,一般缺乏经验的人都会陷入某些坑中。= =...
坑
先说坑,函数参数类型是一坑,类与类的对象这又是一坑。 虽然之前用其他静态类型语言(例如C#/Java)的时候都搞明白了的,但是换了个动态类型的Python,总会有点令人疑惑。
例子
让我用代码来举例子。
首先定义两个类,都继承自内置的 Exception 类,说明这两个类是异常类。
class Error1(Exception):
def __str__(self):
return 'error1'
class Error2(Exception):
def __init__(self):
print('error2 init')
def __str__(self):
return 'error2'
然后再定义处理异常的方法:
def error(err: object):
print(f'err:{err.__str__()}')
def error2(err: Exception):
print(err)
接着是测试代码:
try:
raise Error1
except Error1 as e:
error(e)
if 1 != 2:
error(Error2)
运行结果:
err:error1
File "/home/test.py", line 33, in <module>
error(Error2)
File "/home/test.py", line 19, in error
print(f'err:{err.__str__()}')
TypeError: __str__() missing 1 required positional argument: 'self'
第一个error()的结果没毛病,可是第二个接抛出异常了,看看错误信息先:TypeError: __str__() missing 1 required positional argument: 'self',没有提供self参数,因为这个参数不是Error2类的实例,所以自然没有self参数。
到这里应该有点明白了,就是调用error(Error2)这个方法的时候,传入的Error2参数其实是Error2这个类型本身,并不是它的对象,有点神奇,居然把一个类型当成参数用了。
那要怎么解决呢,很简单,传入Error2的对象就行了。
代码如下:
if 1 != 2:
error(Error2())
运行结果
error2 init
err:error2
没毛病了,上面代码还有个error2方法没有使用呢,来试试看。
error2(Error2)
error2(Error2())
运行结果
<class '__main__.Error2'>
error2 init
error2
可以看出,使用print(Object)的时候,如果是一个类型,就打印这个类型的信息,是类型的对象时,才会打印Object.__str__()返回的结果。
搞明白了之后其实很简单,但是Python对函数参数没有限制,即使给方法加了type hints,也只是起到了提示作用,不会做真正的限制或者是隐式转换,所以有时候代码写久了头晕脑胀,就容易掉进动态类型坑里了 T_T...
国际惯例,放图片:

_EOF_
Python踩坑:类与类对象类型参数传递与使用
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
我用Qt和Python开发了一个视频合并工具
想合并视频,但是却找不到比较好用的工具,很多都要收费,我想着「这破功能还得收费?」,于是决定自己搞一个,一开始用Python做了一个,效果还不错,完美完成了我的视频合并任务,不过没有图形界面,想分享给朋友一起用也没办法,于是昨天用Qt写了个图形界面套上去,中间还是遇到一些问题的,通过这篇文章记录一下。 软件的界面就是这样啦,用Qt Designer随便拖出来的,和VS拖控件也差不了多少。 用起来挺
2021-12-18 · Python · 约 1 分钟
现代 Python 程序优雅处理日期时间的避坑指南
Python 时间处理还是得踩坑?`datetime`、`time`、`calendar` 搞得人头大,Naive vs Aware 时区陷阱更是坑爹。2026 年了还用 `pytz`?标准库 `ZoneInfo` 加上 `Pendulum`、`Arrow` 才叫现代化,至少不用再写反人类的时间字符串解析。数据库存 UTC,前端传 ISO 8601,简单点行不行?
2026-03-25 · Python · 约 1 分钟
Python-缓存机制与-functools-lru_cache
缓存是一种将定量数据加以保存以备迎合后续获取需求的处理方式,旨在加快数据获取的速度。数据的生成过程可能需要经过计算,规整,远程获取等操作,如果是同一份数据需要多次使用,每次都重新生成会大大浪费时间。所以,如果将计算或者远程请求等操作获得的数据缓存下来,会加快后续的数据获取需求。 先来一个简单的例子以了解缓存机制的概念: # -*- coding: utf-8 -*- import random
2022-05-27 · Python · 约 1 分钟
关于Python的异常处理
前言 异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和部分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他编程语言的经验,实践起来并不难。 Python 中(至少)有两种错误:语法错误和异常( syntax errors 和 exceptions )。下面稍微介
2022-05-27 · Python · 约 1 分钟
讨论
共 0 条加载评论中…