作者mantour (朱子)
看板Python
標題Re: [問題] class
時間Sat May 25 12:13:40 2013
※ 引述《sean72 (.)》之銘言:
: class Abc:
: def __init__(self):
: ....
: ....
: def run(self):
: ....
: ....
: if __name__ == '__main__'
: Abc().run()
: 看到上面一段代碼,但是有很大的疑問
: 為什麼是
: Abc().run()
: 而不是
: xyz = Abc()
: xyz.run() ?
: Abc() <--把class當作method執行???
Abc()是呼叫Abc這個class的constructor
作用是回傳一個 Abc的 instance, 這個回傳值本身就是一個object
xyz = Abc() # 呼叫Abc的constructor,
# 並且把xyz這個name binding到回傳的instance上
xyz.run() # 呼叫xyz所binding的 instance 的 run method
Abc().run() # 呼叫Abc的constructor, 並且呼叫其回傳的instance
# 的run method
兩種寫法作用是完全相同的
只是前者Abc()所產生的instance會一直存在, 而且你可以用
xyz這個identifier去操作(access)他
後者產生的object在執行完run method之後你就沒有辦法再操作它
而有可能會被garbage collection清除掉
另外推文裡面提到的static method跟這邊有所不同
一般來說呼叫的方式會是 Abc.run() [雖然 Abc().run()也可以]
另外python的classmethod 和staticmethod和C++,java又有點不同
可以參考官方文件
http://docs.python.org/2/library/functions.html#classmethod
http://docs.python.org/2/library/functions.html#staticmethod
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.57.113.14
※ 編輯: mantour 來自: 61.57.113.14 (05/25 12:14)
※ 編輯: mantour 來自: 61.57.113.14 (05/25 12:16)
推 tails32100:哦哦哦原來如此... 原來是小弟搞錯了Orz 05/25 19:44
推 sbrhsieh:簡單地說就是要有 expression 的觀念 06/02 20:41