Chinaunix首页 | 论坛 | 博客
  • 博客访问: 436956
  • 博文数量: 96
  • 博客积分: 4130
  • 博客等级: 上校
  • 技术积分: 1149
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 12:32
文章分类

全部博文(96)

文章存档

2011年(19)

2010年(75)

2009年(1)

2008年(1)

我的朋友

分类: Python/Ruby

2009-08-27 19:17:12

 

classmethod,staticmethod,还有类里面一般的的method有什么区别?

已有 210 次阅读  2009-05-23 14:38
-
classmethod,staticmethod,还有类里面一般的的method有什么区别?

定义方式,传入的参数,调用方式都不相同。

staticmethod 不需要传入self和cls对象,只有一般的参数。可以通过实例或类对象进行调用。
classmethod需要传入cls对象,可以通过实例和类对象进行高用。
一般的method需要传入self实例对象。

staticmethod,classmethod相关于全局方法,一般用在抽象类或父类中。一般与具体的类无关。

staticmethod
基本上和一个全局函数差不多,只不过可以通过类或类的实例对象(python里说光说对象总是容易产生混淆,因为什么都是对象,包括类,而实际上类实例对象才是对应静态语言中所谓对象的东西)来调用而已,不会隐式地传入任何参数。这个和静态语言中的静态方法比较像。

classmethod
是和一个class相关的方法,可以通过类或类实例调用,并将该class对象(不是class的实例对象)隐式地当作第一个参数传入。就这种方法可能会比较奇怪一点,不过只要你搞清楚了python里class也是个真实地存在于内存中的对象,而不是静态语言中只存在于编译期间的类型,就好办了。

正常的方法就是和一个类的实例对象相关的方法,通过类实例对象进行调用,并将该实例对象隐式地作为第一个参数传入,这个也和其它语言比较像。

以下解释摘自 “”

静态方法

静态方法可以直接被类或类实例调用。它没有常规方法那样的特殊行为(绑定、非绑定、默认的第一个参数规则等等)。完全可以将静态方法当成一个用属性引用方式调用的普通函数来看待。任何时候定义静态方法都不是必须的(静态方法能实现的功能都可以通过定义一个普通函数来实现). 某些程序员认为,当有一堆函数仅仅为某一特定类编写时,这种方式可以提供使用上的一致性。 根据python2.4提供的新的语法,你可以象下面这样来创建一个静态方法,

1 class AClass(object):
2      @staticmethod #静态方法修饰符,表示下面的方法是一个静态方法
3      def astatic( ): print 'a static method'
4 anInstance = AClass( )
5 AClass.astatic( ) # prints: a static method
6 anInstance.astatic( ) # prints: a static method

注:staticmethod是一个内建函数,用来将一个方法包装成静态方法,在2.4以前版本,要用下面的方式定义一个静态方法(不再推荐使用):

1 class AClass(object):
2     def astatic( ): print 'a static method'
3     astatic=staticmethod(astatic)

这种方法在函数定义本身比较长时经常会忘记后面这一行.

 类方法

一个类方法就是你可以通过类或它的实例来调用的方法, 不管你是用类调用这个方法还是类的实例调用这个方法,python只会将实际的类对象做为该方法的第一个参数.记住:方法的第一个参数都是类对象而不是实例对象. 按照惯例,类方法的第一个形参被命名为 cls. 任何时候定义类方法都不是必须的(类方法能实现的功能都可以通过定义一个普通函数来实现,只要这个函数接受一个类对象做为参数就可以了).某些程序员认为这个特性当有一堆函数仅仅为某一特定类编写时会提供使用上的一致性.

你可以象下面这样来生成一个类方法:

1 class ABase(object):
2     @classmethod #类方法修饰符
3     def aclassmet(cls): print 'a class method for', cls.__name__
4 class ADeriv(ABase): pass
5 bInstance = ABase( )
6 dInstance = ADeriv( )
7 ABase.aclassmet( ) # prints: a class method for ABase
8 bInstance.aclassmet( ) # prints: a class method for ABase
9 ADeriv.aclassmet( ) # prints: a class method for ADeriv
10 dInstance.aclassmet( ) # prints: a class method for ADeriv

注:staticmethod是一个内建函数,用来将一个方法封装成类方法,在2.4以前版本,你只能用下面的方式定义一个类方法:

1 class AClass(object):
2   def aclassmethod(cls): print 'a class method'
3   aclassmethod=staticmethod(aclassmethod)
并没有人要求必须封装后的方法名字必须与封装前一致,但建议你总是这样做(如果你使用python2.4版本以下时). 这种方法在函数定义本身比较长时经常会忘记后面这一行.


阅读(1205) | 评论(0) | 转发(0) |
0

上一篇:my first blog @ cublog

下一篇:unix 通配符

给主人留下些什么吧!~~