<span style="font-family: 'Droid Sans Fallback'; background-color: rgb(255, 255, 255);"><span style="font-size:16pt"><span lang="zh-CN"><strong>PYTHON的方法</strong></span></span></span>
方法的定义:
作为类的一部分被定义的函数称为方法,是类的两个属性——数据属性和方法之一。如下:
class MyClass(object):
def myNoActionMethod(self):
pass
myNoActionMethod即为方法。
方法的分类:
绑定方法和非绑定方法:
为与OOP惯例保持一致,Python严格要求,没有实例,方法是不能被调用的。这种限制即Python
所描述的绑定概念(binding),在此,方法必须绑定(到一个实例)才能直接被调用。非绑定的方法可能可以被调用,但实例对象一定要明确给出(就算是self也需要给定),才能确保调用成功。然而,不管是否绑定,方法都是它所在的类的固有属性,即使它们几乎总是通过实例来调用的。
方法只有在其所属的类具有实例时,才能被调用。当存在一个实例时,方法被认为绑定到这个实例了,没有实例时,方法就是未绑定的。
绑定方法:
方法,不管绑定与否,都是由相同的代码组成的。唯一的不同在于是否存在一个实例可以调用此方法。也就是假定现在有一个MyClass类和此类的一个实例mc,而你想调用MyClass.foo()方法。因为已经有一个实例,你只需要调用mc.foo()就可以。
这就是对绑定方法的调用。
非绑定方法:
调用非绑定方法并不经常用到。需要调用一个还没有任何实例的类中的方法的一个主要的场景
是:你在派生一个子类,而且你要覆盖父类的方法,这时你需要调用那个父类中想要覆盖掉的构造方
法。这里是一个本章前面介绍过的例子:
class EmplAddrBookEntry(AddrBookEntry):
'Employee Address Book Entry class'
def __init__(self, nm, ph, em):
AddrBookEntry.__init__(self, nm, ph)
self.empid = id
self.email = em
这是调用非绑定方法的最佳地方了。我们将在子类构造器中调用父类的构造器并且明确地传递
(父类)构造器所需要的self参数(因为我们没有一个父类的实例)。
静态方法和类方法
静态方法和类方法在Python2.2中引入。经典类及新式(new-style)类中都可以使用它。一对内建函数(staticmethod()和classmethod())被引入,用于将作为类定义的一部分的某一方法声明“标记”(tag),“强制类型转换”(cast)或者“换”(convert)为这两种类型的方法(静态方法和类方法)之一。
注释:这种转换(foo= staticmethod(foo))可以用一种更优雅的方式-函数修饰符来实现。这里不做阐述。
静态方法
class TestStaticMethod:
def foo():
print 'calling static method foo()'
foo = staticmethod(foo)
tsm = TestStaticMethod()
tsm.foo()
TestStaticMethod.foo()
输出:
callingstatic method foo()
callingstatic method foo()
在静态方法加入到Python之前,用户只能在全局名字空间中创建函数,作为这种特性的替代实现– 有时在这样的函数中使用类对象来操作类(或者是类属性)。使用模块函数比使用静态类方法更加常见。
参考网友的总结:
1、当一个函数逻辑上属于一个类又不依赖与类的属性的时候,可以使用staticmethod。
2、使用staticmethod可以避免每次使用的时都会创建一个对象的开销。
3、staticmethod可以使用类和类的实例调用。但是不依赖于类和类的实例的状态。
类方法
class TestClassMethod:
def foo(cls):
print 'calling class method foo()'
print 'foo() is part of class:', cls.__name__
foo = classmethod(foo)
tcm = TestClassMethod()
tcm.foo()
TestClassMethod.foo()
输出:
callingclass method foo()
foo()is part of class: TestClassMethod
callingclass method foo()
foo()is part of class: TestClassMethod
注意,类方法中的cls变量。而对于类方法而言,需要类而不是实例作为第一个参数,它是由解释器传给方法。类不需要特别地命名,类似self,不过很多人使用cls作为变量名字。
参考网友总结:
1、classmethod是类对象与函数的结合。
2、可以使用类和类的实例调用,但是都是将类作为隐含参数传递过去。
3、使用类来调用classmethod可以避免将类实例化的开销
参考文献:
1、http://blog.jobbole.com/53989/
2、《python权威编程》