我是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()。说('eeek')这实际上是实例化一个Ape对象并运行init方法吗?我认为不会,但我有一些奇怪的副作用,所以现在我在想它呢?
答案 0 :(得分:13)
如果要在不创建实例的情况下直接调用方法,可以使用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()
答案 1 :(得分:11)
是的。这就是Ape()
的作用:它创建了一个新的Ape
对象,并且作为该过程的一部分,__init__
方法被运行。
在您的示例中,然后调用该对象的say
方法。请注意,如果您没有say
对象,则无法调用Ape
。
答案 2 :(得分:3)
是。 Ape()实例化类Ape的对象,但由于没有赋值,因此没有与之关联的标签。此时调用其__init__
函数。然后,调用say函数。
要明确:
Ape().say('eeek')
相当于:
(Ape()).say('eeek')
更清楚地表明首先发生的事情。