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:error1File "/home/test.py", line 33, in <module>error(Error2)File "/home/test.py", line 19, in errorprint(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
转载于:https://www.cnblogs.com/deali/p/9180806.html
Python踩坑:类与类对象类型参数传递与使用相关推荐
- Python天天美味(4) - isinstance判断对象类型
Python中判度对象类型方法非常简单,不需要像别的语言一样使用如下的判断方法: if (typeof(objA) == typeof(String)) { //TODO } 在Python中 ...
- php instanceof 基类,PHP强制对象类型之instanceof操作符
一.简介 在php(做为现在的主流开发语言)中实现强制对象类型有时可能非常重要.如果缺少了它,或是因为缺乏这方面的知识--基于不正确的编程假设,或者仅仅是由于懒惰,那么你会在特定的Web应用程序中看到 ...
- Gson踩坑笔记:为什么对象的构造方法没有被执行?
前言 最近做项目遇到了一个很奇怪的问题,情况如下: 创建对象TestBean,其中type和name需要接口返回并解析,time字段需要客户端修改,做一些必要的记录,希望time的默认值为10: va ...
- python内置类型_Python内置对象类型
核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...
- python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用
正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...
- java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...
python科学计算数据应用(第2版) 156.4元 (需用券) 去购买 > 1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERR ...
- python踩坑记(使用matplotlib绘制折线图遇到的问题及解法)
前几天老妹说毕设中图表部分是通过excel直接生成的,可能在答辩时候会显得很low,让我教教她怎么用python来画图.看了她的毕设,其实不难处理,就是两个折线图.这也让我松了一口气,毕竟快两年没有写 ...
- Python踩坑指南(第一季)
最近在python开发的过程中,发现了一些比较有意思的问题,确实让自己在开发过程中被恶心了一把,所以开了这个连续的更新博文,之后会持续的按第一第二第三这种版本下去,更新一些比较有意思的python代码 ...
- python中函数type可以测试对象类型_Python中type函数type()显示对象的类型,dir函数dir()显示的是对象可用的方法。_学小易找答案...
[判断题]new_word = word.upper() 这一语句表示将word这个变量的值全部小写并赋给新变量new_word. [单选题]All of the students have fini ...
最新文章
- open3d 0.13版本 vs2019编译
- jvm性能调优实战 - 29使用 jstat 摸清线上系统的JVM运行状况
- HDFS修改副本数并生效
- html如何复用其它页面,编写可以复用的 HTML 模板
- linux服务器插上硬盘不能开机,Linux服务器添加新硬盘无法识别解决方法(无需重启)...
- [BZOJ3173][Tjoi2013]最长上升子序列
- 泛型类 0104 c#
- namedtuple可命名元组
- map std 浮点数索引_C std :: map持有任何类型的值
- 全局变量定义的时候左侧加了static_c语言中static 用法
- java 中public 类
- SOA系列文章之(四):在Web服务中使用SOA
- 当我们做实验的时候,我们在做什么?
- 【解决U盘无法访问】
- 踩方格(空间压缩+动态规划+暴力递归)
- C#表达式目录树系列之5 –动态创建查询表达式
- 你的私密照片可能正被“合法”观看
- Linux系统的特点有哪些
- win10键盘错乱如何恢复--win7w.com
- 使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!