下面的类方法有什么区别?
是不是一个是静态的,另一个不是?
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()
下面的类方法有什么区别?
是不是一个是静态的,另一个不是?
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中,绑定方法和未绑定方法是有区别的。
基本上,调用一个成员函数(比如method_one),一个绑定函数
a_test.method_one()
被翻译为
Test.method_one(a_test)
例如,调用一个未绑定的方法。正因为如此,调用你的method_two版本将会失败并返回TypeError
>>> a_test = Test()
>>> a_test.method_two()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given)
您可以使用装饰器更改方法的行为
class Test(object):
def method_one(self):
print "Called method_one"
@staticmethod
def method_two():
print "Called method two"
装饰器告诉内置的默认元类类型(类的类,参见这个问题)不要为method_two创建绑定方法。
现在,你可以直接在实例或类上调用静态方法:
>>> a_test = Test()
>>> a_test.method_one()
Called method_one
>>> a_test.method_two()
Called method_two
>>> Test.method_two()
Called method_two
对method_two的调用将抛出一个异常,表示不接受self参数,Python运行时将自动传递给它。
如果你想在Python类中创建一个静态方法,用staticmethod装饰器来装饰它。
Class Test(Object):
@staticmethod
def method_two():
print "Called method_two"
Test.method_two()
未绑定的方法
未绑定方法是尚未绑定到任何特定类实例的方法。
绑定的方法
绑定方法是绑定到类的特定实例的方法。
正如这里的文档所述,self可以指不同的东西,这取决于函数是绑定的、未绑定的还是静态的。
看看下面的例子:
class MyClass:
def some_method(self):
return self # For the sake of the example
>>> MyClass().some_method()
<__main__.MyClass object at 0x10e8e43a0># This can also be written as:>>> obj = MyClass()
>>> obj.some_method()
<__main__.MyClass object at 0x10ea12bb0>
# Bound method call:
>>> obj.some_method(10)
TypeError: some_method() takes 1 positional argument but 2 were given
# WHY IT DIDN'T WORK?
# obj.some_method(10) bound call translated as
# MyClass.some_method(obj, 10) unbound method and it takes 2
# arguments now instead of 1
# ----- USING THE UNBOUND METHOD ------
>>> MyClass.some_method(10)
10
由于我们在上次调用中没有使用类实例- obj -,我们可以说它看起来像一个静态方法。
如果是这样,MyClass.some_method(10)调用和使用@staticmethod装饰器修饰的静态函数调用之间的区别是什么?
通过使用装饰器,可以显式地明确使用该方法,而无需首先为其创建实例。通常情况下,人们不会期望在没有实例的情况下使用类成员方法,访问它们可能会导致错误,这取决于方法的结构。
此外,通过添加@staticmethod装饰器,我们也可以通过对象进行访问。
class MyClass:
def some_method(self):
return self
@staticmethod
def some_static_method(number):
return number
>>> MyClass.some_static_method(10) # without an instance
10
>>> MyClass().some_static_method(10) # Calling through an instance
10
你不能用实例方法来做上面的例子。你可以在第一个中存活下来(就像我们之前做的那样),但是第二个将被翻译成一个未绑定的调用MyClass。some_method(obj, 10),它将引发TypeError,因为实例方法接受一个参数,而您无意中试图传递两个参数。
然后,你可能会说,“如果我可以通过实例和类MyClass调用静态方法。some_static_method和MyClass()。Some_static_method应该是相同的方法。”是的!
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方法是如何诞生的。