Python中slf和cls的区别,@staticmethod 和@classmethod区别

在python的类方法中,默认使用的第一个参数是cls,而在实例方法中,一般使用self作为第一个参数。

 

一句话描述:self是类(Class)实例化对象,cls就是类(或子类)本身,取决于调用的是那个类。

两处比较:

        (1)比较一般类方法中的self和cls的区别:

         一般来说,使用某个类的方法,需要先将类实例化,赋予一个对象才可以调用类中的方法,但是如果使用了@staticmethod 或@classmethod,就可以不用实例化,直接类名.方法名()来调用。

         这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。举例:

     

class A(object): a='a' 
       @staticmethod 
       def foo1(name):#静态函数
             print("hello",hello) 
       def foo2(self,name):#常规函数
             print("hello",name)
       @classmethod 
       def foo3(cls,name):#类方法 
             print("hello",name) 
接着我们实例化A类,
a=A() 
print(a.foo1('ma'))#output:hello ma 
print(A.foo1('ma'))#output:hello ma

       而foo2是常规函数,只能通过类的实例化来调用,即a.foo2()来调用。

       而foo3是类函数,cls作为第一个参数用来表示类本身,在类方法中用到,类方法只是与类本身有关而与实例无关的方法。

       可以通过实例化来调用,也可以通过类名.类函数名来调用。

       即a.foo3('mam')或A.foo3('mam') (2)staticmethod和classmethod方法的区别 在classmethod中可以调用类中定义的其他方法、类的属性,但staticmethod只能通过A.a调用类的属性,但无法通过在该函数内部调用A.foo2()。 

class A(object):
        a = 'a' 
        @staticmethod 
        def foo1(name): 
              print 'hello', name 
              print A.a # 正常 
              print A.foo2('mamq') 
              # 报错: unbound method foo2() must be called with A instance as first argument (got str instance instead) 
       def foo2(self, name): 
            print 'hello', name 
            @classmethod 
       def foo3(cls, name): 
             print 'hello', name
             print A.a print 
       cls().foo2(name)#可以在foo3中调用foo2,因为持有cls参数,彷佛是类本身,故可以调用该foo2方法。

 

第三点是关于cls(),其实这就是类本身,比如这里的cls()=A,如果cls()里面有参数,那么这个参数就是构造函数init(self,parameter1,parameter2)中的参数1,2,同时还是表示类本身。

 

来源:https://blog.csdn.net/weixin_36153937/article/details/113960958

posted @ 2022-04-13 15:43  Uriel-w  阅读(136)  评论(0编辑  收藏  举报