[問題] 關於類別方法classmethod

作者: m06800825 ( )   2018-07-19 21:33:58
想請問在以下程式碼中
定義了有兩個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
用這種方式來寫類別方法的用意為何呢?
這樣豈不是多此一舉?
煩請版上各位大神開釋
感激不盡!
作者: s860134 (s860134)   2018-07-19 21:51:00
Cal.add2(5, 6) 明顯是錯的你應該沒執行過你的範例
作者: thefattiger (LT)   2018-07-19 23:07:00
好處就是你也可以透過實體呼叫add1,但add2就不行了
作者: laputaflutin (很恐怖,不要問)   2018-07-19 23:17:00
你的add2方法有問題啊,沒有self
作者: thefattiger (LT)   2018-07-19 23:21:00
再多補一個__add__,add2就沒問題了XD
作者: guaptpan (Gua)   2018-07-19 23:49:00
Add2可以跑沒錯,Cal.c會等於100代入運算還是有少@staticmethod? 突然混亂了XDD
作者: s860134 (s860134)   2018-07-20 00:22:00
a 被帶入 instance 拿去跟 int 相加惹拉,不能跑的 code你能跑一定是你 global 被汙染了,開個檔存起來執行add2 沒有建 instance 是不能被呼叫 就那麼簡單..."unbound method add2() must be called with ...."你剛學 class 以後你會常常看到這個錯誤...
作者: laputaflutin (很恐怖,不要問)   2018-07-20 00:33:00
你是不是用jupyter跑,寫一個py檔用終端跑跑看jupyter會幫你存每次執行過的所有全局變量,跟實際用py檔跑其實很不一樣
作者: s860134 (s860134)   2018-07-20 00:36:00
正確來說 jupyter 真的就是個筆記本他只是幫你一行一行的丟到背後的 python 直譯器去跑所以你可以正的跑反的跑跳者跑這讓你以為你的 code 是正確的,實際上是環境髒了靠悲 3.X 加的新功能
作者: guaptpan (Gua)   2018-07-20 00:44:00
https://i.imgur.com/fZoa96R.jpg真的可以執行耶,但如果用Cal建出實例new_Cal則new_Cal.add2就會出錯
作者: s860134 (s860134)   2018-07-20 00:44:00
python 3.x 開始 unbound method 被視為 function
作者: guaptpan (Gua)   2018-07-20 00:46:00
所以如果針對原po的問題回答的話有一個差別是不加@classmethod的method又不傳入self就只能在非實例實執行建成實例就會出錯
作者: s860134 (s860134)   2018-07-20 00:47:00
https://www.python.org/dev/peps/pep-0575/#id28應該說你上面寫的都沒有把 instance 建出來所以感覺怎麼都一樣你加個 c= Cal() 建立一個 instance 再試上面兩個 method第二個會出錯,他會跟你說你丟了3個參數但是他只吃2個對 instance 來說,第一個參數會默認放入自己另外是 type 改變了你在 ide 上面打 Cal.add2 會顯示 "function Cal.add2 atc.add2 則會顯示 bound method Cal.add2python3 用了好一陣子現在才知道 unbound method 沒了QQ

Links booklink

Contact Us: admin [ a t ] ucptt.com