下面的类方法有什么区别?

是不是一个是静态的,另一个不是?

class Test(object):
  def method_one(self):
    print "Called method_one"

  def method_two():
    print "Called method_two"

a_test = Test()
a_test.method_one()
a_test.method_two()

当前回答

绑定方法=实例方法

解绑定方法=静态方法。

其他回答

当调用类成员时,Python自动使用对象引用作为第一个形参。变量self实际上没有任何意义,它只是一种编码约定。如果你愿意,可以叫它滴水怪。也就是说,对method_two的调用将引发TypeError,因为Python会自动尝试将一个参数(对其父对象的引用)传递给一个定义为没有参数的方法。

为了让它工作,你可以把这个附加到你的类定义:

method_two = staticmethod(method_two)

或者您可以使用@staticmethod函数装饰器。

Method_two不能工作,因为你定义了一个成员函数,但没有告诉它这个函数是什么成员。如果你执行最后一行,你会得到:

>>> a_test.method_two()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given)

如果你为一个类定义成员函数,第一个参数必须总是'self'。

请阅读Guido First Class的文档,清楚地解释了Unbound, Bound方法是如何诞生的。

这是一个错误。

首先,第一行应该是这样的(注意大写)

class Test(object):

当你调用一个类的方法时,它将自己作为第一个参数(因此命名为self), method_two会给出这个错误

>>> a.method_two()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given)

对method_two的调用将抛出一个异常,表示不接受self参数,Python运行时将自动传递给它。

如果你想在Python类中创建一个静态方法,用staticmethod装饰器来装饰它。

Class Test(Object):
  @staticmethod
  def method_two():
    print "Called method_two"

Test.method_two()