Python 板


LINE

想請問在以下程式碼中 定義了有兩個add方法的類別Cal class Cal(): c = 100 def __init__(self): pass @classmethod def add1(cls, a, b): print (a + b + cls.c) def add2(a, b): print (a + b + Cal.c) Cal.add1(5, 6) Cal.add2(5, 6) 兩個函數都可以直接透過Cal.來呼叫 並且都會印出111 所以兩個都是類別方法 那add1上面加上修飾子@classmethod 引數又多寫一個cls 用這種方式來寫類別方法的用意為何呢? 這樣豈不是多此一舉? 煩請版上各位大神開釋 感激不盡! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.77.113
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1532007244.A.9EF.html
1F:→ s860134: Cal.add2(5, 6) 明顯是錯的 07/19 21:51
2F:→ s860134: 你應該沒執行過你的範例 07/19 21:53
有跑過了! 是可以執行的! 結果會印出兩個111 ※ 編輯: m06800825 (123.193.77.113), 07/19/2018 21:59:13
3F:→ thefattiger: 好處就是你也可以透過實體呼叫add1,但add2就不行了 07/19 23:07
4F:→ laputaflutin: 你的add2方法有問題啊,沒有self 07/19 23:17
我是想要當作類別方法用不是實體方法 所以應該要不加self吧?
5F:→ thefattiger: 再多補一個__add__,add2就沒問題了XD 07/19 23:21
6F:推 guaptpan: Add2可以跑沒錯,Cal.c會等於100代入運算 07/19 23:49
7F:推 guaptpan: 還是有少@staticmethod? 突然混亂了XDD 07/20 00:00
加@staticmethod好像是靜態方法不是類別方法 ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:22:48
8F:→ s860134: a 被帶入 instance 拿去跟 int 相加惹拉,不能跑的 code 07/20 00:22
9F:→ s860134: 你能跑一定是你 global 被汙染了,開個檔存起來執行 07/20 00:23
10F:→ s860134: add2 沒有建 instance 是不能被呼叫 就那麼簡單... 07/20 00:24
11F:→ s860134: "unbound method add2() must be called with ...." 07/20 00:27
12F:→ s860134: 你剛學 class 以後你會常常看到這個錯誤... 07/20 00:27
可是剛把add1拿掉還是可以跑欸... 越來越混亂了QQ ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:31:29
13F:→ laputaflutin: 你是不是用jupyter跑,寫一個py檔用終端跑跑看 07/20 00:33
我是用python內建的IDLE跑的 換成用Spyder也可以跑~ ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:36:01
14F:→ laputaflutin: jupyter會幫你存每次執行過的所有全局變量,跟實際 07/20 00:35
15F:→ laputaflutin: 用py檔跑其實很不一樣 07/20 00:35
我是存成py檔來跑的沒錯 ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:37:01
16F:→ s860134: 正確來說 jupyter 真的就是個筆記本 07/20 00:36
17F:→ s860134: 他只是幫你一行一行的丟到背後的 python 直譯器去跑 07/20 00:36
18F:→ s860134: 所以你可以正的跑反的跑跳者跑 07/20 00:37
19F:→ s860134: 這讓你以為你的 code 是正確的,實際上是環境髒了 07/20 00:37
我是存成py檔來跑的QQ 附上截圖https://imgur.com/a/VuRpL7n ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:40:32
20F:→ s860134: 靠悲 3.X 加的新功能 07/20 00:43
21F:推 guaptpan: https://i.imgur.com/fZoa96R.jpg 07/20 00:44
22F:→ guaptpan: 真的可以執行耶,但如果用Cal建出實例new_Cal則 07/20 00:44
23F:→ guaptpan: new_Cal.add2就會出錯 07/20 00:44
喔喔所以主要是差在add2只能用類別呼叫而不能透過實例呼叫 add1則兩者都可呼叫 這樣理解應該沒錯吧?
24F:→ s860134: python 3.x 開始 unbound method 被視為 function 07/20 00:44
我是直接學python3的新手XD 原來是新功能RRR ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:48:43
25F:→ guaptpan: 所以如果針對原po的問題回答的話 07/20 00:46
26F:→ guaptpan: 有一個差別是不加@classmethod的method又不傳入self就只 07/20 00:46
27F:→ guaptpan: 能在非實例實執行 07/20 00:46
28F:→ guaptpan: 建成實例就會出錯 07/20 00:46
29F:→ s860134: https://www.python.org/dev/peps/pep-0575/#id28 07/20 00:47
了解!!! 感謝各位陪我這個初學者討論~ ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:50:56
30F:→ s860134: 應該說你上面寫的都沒有把 instance 建出來 07/20 00:51
31F:→ s860134: 所以感覺怎麼都一樣 07/20 00:51
所以如果用instance呼叫add2 就會因為多傳了一個self參數所以無法執行 應該沒錯吧XD ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 00:54:58
32F:→ s860134: 你加個 c= Cal() 建立一個 instance 再試上面兩個 method 07/20 00:54
33F:→ s860134: 第二個會出錯,他會跟你說你丟了3個參數但是他只吃2個 07/20 00:54
34F:→ s860134: 對 instance 來說,第一個參數會默認放入自己 07/20 00:55
35F:→ s860134: 另外是 type 改變了 07/20 00:55
36F:→ s860134: 你在 ide 上面打 Cal.add2 會顯示 "function Cal.add2 at 07/20 00:56
37F:→ s860134: c.add2 則會顯示 bound method Cal.add2 07/20 00:57
恩恩終於搞懂差別在哪了QQ 謝謝s大! ※ 編輯: m06800825 (123.193.77.113), 07/20/2018 01:00:05
38F:→ s860134: python3 用了好一陣子現在才知道 unbound method 沒了QQ 07/20 01:01







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP