Python踩坑:类与类对象类型参数传递与使用
前言
对初学者来说,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...
国际惯例,放图片:

About

了解更多有趣的操作请关注我的微信公众号:DealiAxy
每一篇文章都在我的博客有收录:blog.deali.cn
Python踩坑:类与类对象类型参数传递与使用的更多相关文章
- Python踩坑之旅其一杀不死的Shell子进程
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...
- [代码修订版] Python 踩坑之旅进程篇其五打不开的文件
目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- python踩坑系列之导入包时下划红线及报错“No module named”问题
python踩坑系列之导入包时下划红线及报错“No module named”问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下(fileshand ...
- Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...
- Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...
- Python踩坑之旅其二裸用os.system的原罪
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...
- [代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 公 ...
- 【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常
1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERROR日志,发现抛了这样的异常:java.lang.NumberFormatExcep ...
随机推荐
- Spark Streaming从Flume Poll数据案例实战和内幕源码解密
本节课分成二部分讲解: 一.Spark Streaming on Polling from Flume实战 二.Spark Streaming on Polling from Flume源码 第一部分 ...
- php中将SimpleXMLElement Object数组转化为普通数组
做微信开发,鉴于微信POST的消息是XML数据包,通过SimpleXMLElement Object获取的数据不好操作,需要转化为普通数组. 网上找了很多方法都不理想,发现通过json_decode和 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何让不同的PLC程序分线程运行 TC3
右击Tasks,添加一个新的Task 可以为这个线程设置自定义的扫描周期 然后在项目上右击添加Referenced Task 在TaskSub1上右击添加现有项,把之气写好的PRG程序绑定 ...
- 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI
Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...
- Excel 将换行符替换为空
Step1:按快捷键Ctrl+H,打开"查找和替换"对话框: Step2:选择"查找内容"后的文本框,按住Alt键,在数字键盘中输入&quo ...
- odoo8.0条形码改为js方式处理
群里网友@上海-gavin 提供的odoo条形码处理,将原来的图片生成方式改为js处理方式. <div class="row text-center"> <div ...
- iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究
今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...
- Docker -CentOS 6.5上安装
开始安装daoker之旅: 1. [root@localhost ~]# uname -r -.el6.x86_64 2. [root@localhost ~]# cat /etc/issue Cen ...
- JAVA自带监控工具的介绍
转:http://www.alidw.com/?p=326 相信部分同学可能还是不太了解或者很少使用,这些监控工具是jdk5.0以上才会有的,有部分是liunx特有的. 了解这些工具再做压力测试和调优 ...
- ReferenceError: Promise is not define
尽管加入了babel-polyfill ,依然出现 [ReferenceError: Promise is not define]的问题.目前只在三星.金立手机出现这种问题.没办法,只能强行修复了. ...