Python的方法

<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可以避免每次使用的时都会创建一个对象的开销。

  1. 3staticmethod可以使用类和类的实例调用。但是不依赖于类和类的实例的状态。



类方法


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作为变量名字。


参考网友总结:

1classmethod是类对象与函数的结合。

  1. 2、可以使用类和类的实例调用,但是都是将类作为隐含参数传递过去。

    3、使用类来调用classmethod可以避免将类实例化的开销


参考文献:

1http://blog.jobbole.com/53989/

2、《python权威编程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值