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 ...
随机推荐
- 阻止 gulp 发生异常后退出
gulp-plumber 可以阻止 gulp 插件发生错误导致进程退出并输出错误日志.
- new Thread(new ThreadStart(this.StartServer))
Thread .new thUdpServer thUdpServer = new Thread(new ThreadStart(this.StartServer))
- 原生 javascript 基础回顾
(1)打开新窗口 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL:可选参数,在窗口中要显示网页的网址或路径.如果省略这个参数,或者它的值是空 字符串 ...
- T420s成功加装固态硬盘(SSD)
目的 为了提升系统和经常使用工具的启动速度,ThinkPad T420s光驱位加一块固态硬盘. 操作步骤 购买:没做太多对照了解,初步计划是安装在光驱位,直接JD上买了SanDisk的128G和推荐的 ...
- Lomboz插件的介绍 下载 安装 问题
http://www.blogjava.net/javaandcc/articles/251334.html Lomboz是Eclipse的一个主要的开源插件(open-source plug-in) ...
- css3的Background新属性
前言 CSS3中出现了几种关于背景图片的新属性:background-origin.background-clip.background-position等.之前大致了解了下,但是background ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅—— 摘要
首次接触asp.net开发,希望把自己的学习之旅写下来,一方面做个知识归纳技术总结,另一方面开放到博客中,和大家一起交流学习! asp.net是目前流行的web开发技术之一,是微软旗下开发的基于.ne ...
- centos7安装thrift
1. 升级所有软件包 yum -y update 2.安装开发工具 yum -y groupinstall "Development Tools" 3.安装wget yum -y ...
- tcp/ip ---子网寻址
现在所有的主机都要求支持子网编址( RFC 950 [Mogul and Postel 1985]).不是把I P地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号. ...
- JanusGraph的schema及数据建模
每个JanusGraph都有一个schema,该schema由edge labels, property keys和vertex labels组成.JanusGraph的schema可以显式或隐式创建 ...