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 ...
随机推荐
- 转:http2的资料与使用
https://imququ.com/post/http2-resource.html
- mui 上拉加载更多
看起来很简单的东西,实践过程中还是出现了很多麻烦,比如上拉时,状态条跑到了顶部,因为内容没有添加到容器中,再比如下拉的回调函数使用问题,this的传递. html实现部分: <div class ...
- 读写锁pthread_rwlock_t的使用(转)
读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排他的,读可以有多个在读,写只有唯一个在写,同时写的时候不允许读. 具有强读者同步和强写者同步两种形式 强读者同步:当写者没有进行写操作,读者就 ...
- 创建支持多种屏幕尺寸的apk
文章转至:http://hell0android.iteye.com/blog/1899605 创建对两种以上屏幕尺寸的多apk支持(Creating Multiple APKs with 2+ Di ...
- android 调用系统界面
现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...
- hdu1010 dfs+路径剪枝
题意:用一个案例来解释 4 4 5 S.X. ..X. ..XD .... 在这个案例中,是一个4*4的地图. . 表示可走的地方, X 表示不可走的地方,S表示起始点,D表示目标点.没走到一个点之后 ...
- poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用
题意: 给一个L,求长度最小的全8数满足该数是L的倍数. 分析: 转化为求方程a^x==1modm. 之后就是各种数学论证了. 代码: //poj 3696 //sep9 #include <i ...
- 虚拟机安装Ubuntu 12.04 出现提示“Ubuntu is running in low-graphics mode?”
原文链接: http://blog.csdn.net/maimang1001/article/details/17048273 http://blog.csdn.net/bluetropic/arti ...
- redis 大内存主从问题解决
redis 内存太大使用太大会导致同步陷入循环,每次rdb还没同步完成,新的同步又起,解决办法: redis-cli config set client-output-buffer-limit &qu ...
- 怎样设置mysql的表不区分你大写和小写
Linux上安装MySQL默认是数据库的表大写和小写敏感的.改动非常easy.仅仅要该一个mysql的配置文件就能够了. mysql> show tables; +--------------- ...