python的classmethod和staticmethod方法

本文介绍了Python中的类方法和静态方法的区别与使用方法。详细解释了@classmethod和@staticmethod装饰器的功能,以及如何通过类对象和实例进行调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

classmethod:类方法
staticmethod:静态方法

Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

  • @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 
  • 普通对象方法至少需要一个self参数,代表类对象实例
  • 类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。 
  • 静态方法则无需参数,staticmethod方法也不能直接访问类成员。它基本上跟一个全局函数相同,一般来说用的很少
例子:
class A(object):  
    bar = 1  
    def foo(self):  
        print 'foo'  
 
    @staticmethod  
    def static_foo():  
        print 'static_foo'  
        print A.bar  
 
    @classmethod  
    def class_foo(cls):  
        print 'class_foo'  
        print cls.bar  
        cls().foo()  
  
A.static_foo()  
A.class_foo() 
类b继承A:
class b(A):
    print 'b is start'
    def class_foo(self):
        print 'b.class_foo'
        #def static_foo(self):
        #print 'b.static_foo'

f1 = b()
print f1.class_foo()
print f1.static_foo()
结果:


说明:实例方法针对的是实例,类方法针对的是类,他们都可以继承和重新定义,静态方法也能继承(NND),可以认为是全局函数。

class MethodTest():
    var1 = "class var"
   
    def __init__(self, var2 = "object var"):
        self.var2 = var2
   
    @staticmethod

    def staticFun():
        print 'static method' 
   
    @classmethod

    def classFun(cls):
        print 'class method'

 

staticmethod和classmethod的相同点:

1.都可以通过类或实例调用

mt = MethodTest()

MethodTest.staticFun()

mt.staticFun()

MethodTest.classFun()

mt.classFun()

2.都无法访问实例成员

    @staticmethod

    def staticFun():
        print var2  //wrong 
    @classmethod

    def classFun(cls):
        print var2  //wrong

 

staticmethod和classmethod的区别:

1.staticmethod无需参数,classmethod需要类变量作为参数传递(不是类的实例)

    def classFun(cls):
        print 'class method'  //cls作为类变量传递

2.classmethod可以访问类成员,staticmethod则不可以

    @staticmethod

    def sta




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值