作者hsnu114444 (littleq0903)
看板Python
標題[分享] Class method
時間Sun Sep 26 02:19:04 2010
這是最近遇到一個人的問題,我突然發現其實書上很少提及
光是decorator就很少有書在講了,但是我覺得有分享出來的需要
Q: Python如何define一個class method?
在Python裡面的話,定一個method的話,第一個引數都要吃一個self當做instance的連結
所以你要是class沒有實體化的話,呼叫一個method就會發生TypeError
EX class:
>>> class myClass():
... def instMethod(self):
... return self
... def classMethod():
... print 'call classMethod()'
... def classMethod2(self):
... print self
這時候你就會發現你不訂第一個引數self,他會做檢查引發TypeError不會讓你success,
因為他一定要傳一個引數進去,所以如果我們要定一個classmethod怎麼辦呢?
要利用"@classmethod"這個decorator
>>> class myClass():
... @classmethod
... def classMethod(cls):
... print cls
再去做呼叫看看
>>> myClass.classMethod()
<class __main__.myClass at 0x466150>
就會發現第一個引數不傳instance了,改傳class
如果有版友還要補充,請多多指教^_^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.135.70
1F:推 apua:我之前接觸decorator發現他的功用真的五花八門,非常值得研究 09/26 08:08
2F:推 ericsk:還有 @staticmethod 不傳 class 也不傳 instance 09/26 10:46
3F:→ hsnu114444:可是@staticmethod拿得到private var嗎? 09/26 12:45
4F:→ hsnu114444:decorator真的蠻重要的,我發現: 09/26 12:46
5F:→ hsnu114444:偏向教學的書都不太講,偏向實作的書比較會講 09/26 12:46
6F:推 eromoot:真的要好好研究 ... 09/26 13:52
7F:推 liangjr:Python無private var吧 若說是class var的話 09/28 10:24
8F:→ liangjr:ClassName.classVariable一樣可以用 09/28 10:24
9F:推 neowaiter:推推 09/28 12:25
10F:→ hsnu114444:private var有阿?變數名稱加兩條底線在前面 09/29 13:32
11F:→ apua:回樓上,那確實是private,但是可照樓上liangjr提的方法去讀 10/01 20:20
12F:推 liangjr:變數名稱加雙底線只是naming convention 10/05 05:57
13F:→ liangjr:但並沒有機制防止你從別的class存取OtherClass.__private 10/05 05:58
14F:→ liangjr:或other_class_instance.__private 所以不能算是真的 10/05 06:00
15F:→ liangjr:支援private variable或method 10/05 06:00
16F:→ liangjr:err... OtherClass._OtherClass__private 10/05 06:38