作者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)
1F:推 tails32100:哦哦哦原来如此... 原来是小弟搞错了Orz 05/25 19:44
2F:推 sbrhsieh:简单地说就是要有 expression 的观念 06/02 20:41