前言

对初学者来说,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踩坑:类与类对象类型参数传递与使用相关推荐

  1. Python天天美味(4) - isinstance判断对象类型

    Python中判度对象类型方法非常简单,不需要像别的语言一样使用如下的判断方法: if (typeof(objA) == typeof(String)) {     //TODO } 在Python中 ...

  2. php instanceof 基类,PHP强制对象类型之instanceof操作符

    一.简介 在php(做为现在的主流开发语言)中实现强制对象类型有时可能非常重要.如果缺少了它,或是因为缺乏这方面的知识--基于不正确的编程假设,或者仅仅是由于懒惰,那么你会在特定的Web应用程序中看到 ...

  3. Gson踩坑笔记:为什么对象的构造方法没有被执行?

    前言 最近做项目遇到了一个很奇怪的问题,情况如下: 创建对象TestBean,其中type和name需要接口返回并解析,time字段需要客户端修改,做一些必要的记录,希望time的默认值为10: va ...

  4. python内置类型_Python内置对象类型

    核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...

  5. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  6. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...

    python科学计算数据应用(第2版) 156.4元 (需用券) 去购买 > 1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERR ...

  7. python踩坑记(使用matplotlib绘制折线图遇到的问题及解法)

    前几天老妹说毕设中图表部分是通过excel直接生成的,可能在答辩时候会显得很low,让我教教她怎么用python来画图.看了她的毕设,其实不难处理,就是两个折线图.这也让我松了一口气,毕竟快两年没有写 ...

  8. Python踩坑指南(第一季)

    最近在python开发的过程中,发现了一些比较有意思的问题,确实让自己在开发过程中被恶心了一把,所以开了这个连续的更新博文,之后会持续的按第一第二第三这种版本下去,更新一些比较有意思的python代码 ...

  9. python中函数type可以测试对象类型_Python中type函数type()显示对象的类型,dir函数dir()显示的是对象可用的方法。_学小易找答案...

    [判断题]new_word = word.upper() 这一语句表示将word这个变量的值全部小写并赋给新变量new_word. [单选题]All of the students have fini ...

最新文章

  1. open3d 0.13版本 vs2019编译
  2. jvm性能调优实战 - 29使用 jstat 摸清线上系统的JVM运行状况
  3. HDFS修改副本数并生效
  4. html如何复用其它页面,编写可以复用的 HTML 模板
  5. linux服务器插上硬盘不能开机,Linux服务器添加新硬盘无法识别解决方法(无需重启)...
  6. [BZOJ3173][Tjoi2013]最长上升子序列
  7. 泛型类 0104 c#
  8. namedtuple可命名元组
  9. map std 浮点数索引_C std :: map持有任何类型的值
  10. 全局变量定义的时候左侧加了static_c语言中static 用法
  11. java 中public 类
  12. SOA系列文章之(四):在Web服务中使用SOA
  13. 当我们做实验的时候,我们在做什么?
  14. 【解决U盘无法访问】
  15. 踩方格(空间压缩+动态规划+暴力递归)
  16. C#表达式目录树系列之5 –动态创建查询表达式
  17. 你的私密照片可能正被“合法”观看
  18. Linux系统的特点有哪些
  19. win10键盘错乱如何恢复--win7w.com
  20. 使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!

热门文章

  1. Cvmat IplImage
  2. etc/ld.so.conf的使用说明
  3. 94授权登录steam怎么用_Steam手机令牌如何绑定,绑定后好处多多
  4. css3学习 之 css选择器(css3 属性选择器)
  5. Hibernate标识符属性(主键)生成策略全析
  6. 手动绑定数据到DatList并实现编辑,删除,取消···
  7. 抽象工厂+反射=反射工厂
  8. 算法:合并两个有序链表
  9. 算法-电话号码的字母组合
  10. muduo之TcpClient