欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Python中类方法和静态方法

shiping1 的头像

1、类中的静态方法

要在类中使用静态方法,需在静态方法前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。

使用静态方法的好处其函数不需要self参数,可以通过类调用该方法,不需要定义该类实例(当然通过类实例调用也没有问题)。

2、类方法

类方法可以通过类或它的实例来调用,该方法的第一个参数cls是定义该方法的类对象而不是实例对象。 

3、示例

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #coding:utf-8  
  2. class A:  
  3.     def function(self):  
  4.         print "Call nomal method"  
  5.     @staticmethod #静态方法  
  6.     def Function1():  
  7.         print "Call static method"  
  8.     @classmethod #类方法  
  9.     def Function2(cls):   
  10.         print "Call class method"  
  11.         print "cls.__name__ is ",cls.__name__  
  12.   
  13. if __name__ == '__main__':  
  14.     a = A() #类实例化  
  15.     a.function() #调用类中普通方法  
  16.     A.Function1() #调用类中静态方法  
  17.     A.Function2() #调用类中类方法  
结果:
[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Call nomal method  
  2. Call static method  
  3. Call class method  
  4. cls.__name__ is  A 
来自 http://blog.csdn.net/maoersong/article/details/32714781


Python中纠结处之其一—— 静态方法、类方法

  转身投入Python有一周左右的日子了。这一周不能算是很仔细的去研究它,用比喻的话,还在学习骑车的阶段,未及拆车和造车这样高深。

  但此时就有了让我产生纠结之处。查阅了一些已对这点做比较的博文,对其有所领悟。其实,问题是先来自于Python具有魅力的Decorator。其内置的三个Decorator让我有些许不解。

@staticmethod

@classmethod

@proptey

  本身来自于Java的先入为主,让我对类方法和静态方法没了区别的概念。但在前人的博文中找到一个例子,让我略有了些领悟

复制代码
class A(object):
    def foo(self,x):

        print "executing foo(%s,%s)"%(self,x)

    @classmethod
    def class_foo(cls,x):
     
        print "executing class_foo(%s,%s)"%(cls,x)

    @staticmethod
    def static_foo(x):

        print "executing static_foo(%s)"%x

a = A()

a.foo(1)

a.class_foo(1)
A.class_foo(1)

a.static_foo(1)
A.static_foo(1)
复制代码

  输出的结果为

executing foo(<__main__.A object at 0x004E0730>,1)
executing class_foo(<class '__main__.A'>,1)
executing class_foo(<class '__main__.A'>,1)
executing static_foo(1)
executing static_foo(1)

  首先,实例方法,很清楚,打印了该实例化的对象的信息(在内存中的地址)

  然后是类方法,cls这个参数打印出的是 类A这个对象(Python中任何都是对象),不管是否是实例化的调用

  最后是静态方法,与调用也无关,并且这个方法不依赖任何对象。

  一些粗浅的认识:

  • 实例化以后,类方法和静态方法也可以使用(似乎是废话)
  • 类方法和静态方法不能访问需要实例化的属性()
  • 实例方法是由一个类实例化后产生的,所以能访问实例化后的对象的属性
  • 因为在Python中,类也是对象,所以,类方法相对静态方法的一大特点是可以访问类具有的属性,但是静态方法不行 !

      似乎就是这些领悟,后面遇到问题再来更新吧

来自 http://www.cnblogs.com/artoruis/archive/2011/09/13/2174906.html

 

Python 中的 classmethod 和 staticmethod 有什么具体用途?

按票数排序按时间排序

4 个回答




 

普通分类: