zoukankan      html  css  js  c++  java
  • python3 中的cls和self的区别 静态方法和类方法的区别

     


    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

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

    class A():
            a='1'
    
            @staticmethod
            def foo1(name):
                    print("hello,%s"%(name))
            def foo2(self,name):
                    print("hello,%s"%(name))
    
            @classmethod
            def foo3(cls,name):
                    print("hello,%s"%(name))
    
    
    a=A()
    a.foo1('mamq')
    A.foo1('mamq')
    print("---------------------"*20)
    a.foo2('mamq')
    #A.foo2('mamq')
    
    a.foo3('foo3')
    A.foo3('foo3')

    首先定义一个类A,类A中有三个函数,foo1为静态函数,用@staticmethod装饰器装饰,这种方法与类有某种关系但不需要使用到实例或者类来参与。如下两种方法都可以正常输出,也就是说既可以作为类的方法使用,也可以作为类的实例的方法使用。

    1.  
      a = A()
    2.  
      a.foo1('mamq') # 输出: hello mamq
    3.  
      A.foo1('mamq')# 输出: hello mamq

    foo2为正常的函数,是类的实例的函数,只能通过a调用。

    1.  
      a.foo2('mamq') # 输出: hello mamq
    2.  
      A.foo2('mamq') #   报错:普通类方法不能这样来调用 

    foo3为类函数,cls作为第一个参数用来表示类本身. 在类方法中用到,类方法是只与类本身有关而与实例无关的方法。如下两种方法都可以正常输出。

    1.  
      a.foo3('mamq') # 输出: hello mamq
    2.  
      A.foo3('mamq') # 输出: hello mamq
     

    在个人多次试验后,目前只发现了 类方法有防止硬解码的效果,其他情况下,类方法都可以用静态方法代替

  • 相关阅读:
    jquery的img的动态title换行
    PHP小技巧
    Jquery zTree结合Asp.net实现异步加载数据
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0,"解决办法
    ORACLE使用数据泵导入导出部分表
    兼容IE、火狐、谷歌的页面关闭事件
    MySQL存储引擎总结
    linux常用基本命令
    PHP扩展模块Pecl、Pear以及Perl的区别
    php实现socket
  • 原文地址:https://www.cnblogs.com/ZFBG/p/11459551.html
Copyright © 2011-2022 走看看