日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Python踩坑:类与类对象类型参数传递与使用

發(fā)布時(shí)間:2025/5/22 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python踩坑:类与类对象类型参数传递与使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

對(duì)初學(xué)者來說,Python確實(shí)簡單好用,畢竟動(dòng)態(tài)類型語言,不用定義就可以拿來用,類型之間隨意轉(zhuǎn)換簡直不要太方便,因此Python用來寫寫小腳本,爬蟲程序什么的,沒什么問題。
不過,一旦用來開發(fā)稍微大型一點(diǎn)的項(xiàng)目,例如搭建一個(gè)Web應(yīng)用,就會(huì)遇到一些問題,一般缺乏經(jīng)驗(yàn)的人都會(huì)陷入某些坑中。= =...

先說坑,函數(shù)參數(shù)類型是一坑,類與類的對(duì)象這又是一坑。
雖然之前用其他靜態(tài)類型語言(例如C#/Java)的時(shí)候都搞明白了的,但是換了個(gè)動(dòng)態(tài)類型的Python,總會(huì)有點(diǎn)令人疑惑。

例子

讓我用代碼來舉例子。

首先定義兩個(gè)類,都繼承自內(nèi)置的 Exception 類,說明這兩個(gè)類是異常類。

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)

運(yùn)行結(jié)果:

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'

第一個(gè)error()的結(jié)果沒毛病,可是第二個(gè)接拋出異常了,看看錯(cuò)誤信息先:TypeError: __str__() missing 1 required positional argument: 'self',沒有提供self參數(shù),因?yàn)檫@個(gè)參數(shù)不是Error2類的實(shí)例,所以自然沒有self參數(shù)。

到這里應(yīng)該有點(diǎn)明白了,就是調(diào)用error(Error2)這個(gè)方法的時(shí)候,傳入的Error2參數(shù)其實(shí)是Error2這個(gè)類型本身,并不是它的對(duì)象,有點(diǎn)神奇,居然把一個(gè)類型當(dāng)成參數(shù)用了。

那要怎么解決呢,很簡單,傳入Error2的對(duì)象就行了。
代碼如下:

if 1 != 2:error(Error2())

運(yùn)行結(jié)果

error2 init err:error2

沒毛病了,上面代碼還有個(gè)error2方法沒有使用呢,來試試看。

error2(Error2) error2(Error2())

運(yùn)行結(jié)果

<class '__main__.Error2'> error2 init error2

可以看出,使用print(Object)的時(shí)候,如果是一個(gè)類型,就打印這個(gè)類型的信息,是類型的對(duì)象時(shí),才會(huì)打印Object.__str__()返回的結(jié)果。
搞明白了之后其實(shí)很簡單,但是Python對(duì)函數(shù)參數(shù)沒有限制,即使給方法加了type hints,也只是起到了提示作用,不會(huì)做真正的限制或者是隱式轉(zhuǎn)換,所以有時(shí)候代碼寫久了頭暈?zāi)X脹,就容易掉進(jìn)動(dòng)態(tài)類型坑里了 T_T...

國際慣例,放圖片:

About


了解更多有趣的操作請(qǐng)關(guān)注我的微信公眾號(hào):DealiAxy
每一篇文章都在我的博客有收錄:blog.deali.cn

轉(zhuǎn)載于:https://www.cnblogs.com/deali/p/9180806.html

總結(jié)

以上是生活随笔為你收集整理的Python踩坑:类与类对象类型参数传递与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。