Python:直接调用方法会实例化对象吗?
我刚开始学习Python,在给我的对象做单元测试的时候,发现了一些“奇怪”的事情。
class Ape(object):
def __init__(self):
print 'ooook'
def say(self, s):
print s
def main():
Ape().say('eeek')
if __name__ == '__main__':
main()
我写了这个小例子来说明我困惑的地方。如果你执行Ape().say('eeek'),这是不是实际上创建了一个Ape对象并运行了初始化方法?我原以为不会这样,但出现了一些奇怪的副作用,所以现在我在想,可能确实是这样?
3 个回答
3
没错。Ape() 是在创建一个Ape类的对象,不过因为没有给它起名字,所以它没有标签。这个时候,它的 __init__
函数会被调用。接着,say函数也会被调用。
为了更清楚:
Ape().say('eeek')
这相当于:
(Ape()).say('eeek')
这样更清楚地说明了先发生了什么。
14
如果你想直接调用一个方法,而不需要先创建一个对象,你可以使用 staticmethod
装饰器。注意,当你使用静态方法时,里面没有 self
这个参数。
class Ape(object):
def __init__(self):
print 'ooook'
@staticmethod
def say(s):
print s
def main():
Ape.say('eeek')
if __name__ == '__main__':
main()
和类方法相比,类方法的第一个参数是类本身,而不是一个对象。
class Ape(object):
def __init__(self):
print 'ooook'
@classmethod
def say(cls, s):
print "the class is:", cls
print s
def main():
Ape.say('eeek')
if __name__ == '__main__':
main()
12
是的,确实如此。这就是Ape()
的作用:它创建了一个新的Ape
对象,并且在这个过程中会运行__init__
方法。
在你的例子中,你接着调用了那个对象的say
方法。注意,如果没有Ape
对象,就无法调用say
方法。