[问题] 关于类别方法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