• Python中@staticmethod和@classmethod的作用和区别


    简单介绍一下两者的区别:

    对于一般的函数test(x),它跟类和类的实例没有任何关系,直接调用test(x)即可

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    def foo(x):
        print  "running  (%s)" % x
    
    foo("test")

    对于普通的类,来调类中的函数:

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    class A:
        def test(self, x):
            print "running (%s, %s)" % (self, x)
    
    a = A()
    a.test("test")

    当我们需要和类直接进行交互,而不需要和实例进行交互时,类方法是最好的选择。

    类方法与实例方法类似,但是传递的不是类的实例,而是类本身,第一个参数是cls。我们可以用类的实例调用类方法,也可以直接用类名来调用。

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    class A:
        class_attr = "test"
        
        def __init__(self):
            pass
            
        @classmethod
        def class_test(cls):
            print  "running class_test(%s)" % (cls.class_attr)
    
    a = A()
    a.class_test()
    A.class_test()

    静态方法类似普通方法,参数里面不用self。这些方法和类相关,但是又不需要类和实例中的任何信息、属性等等。

    如果把这些方法写到类外面,这样就把和类相关的代码分散到类外,使得之后对于代码的理解和维护都是巨大的障碍。而静态方法就是用来解决这一类问题的。

    比如我们检查是否开启了日志功能,这个和类相关,但是跟类的属性和实例都没有关系。

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    log_enabled = True
    
    class A:
        class_attr = "attr"
        
        def __init__(self):
            pass
            
        @staticmethod
        def static_test():
            if log_enabled:
                print("log is enabled")
            else:
                print("log is disabled")
            
    
    A.static_test()
  • 相关阅读:
    此查询使用的不是 ANSI 外部联接运算符
    centos重启命令
    updatePanel 加载完成后回调JS
    建站推荐十个免费的CMS内容管理系统(Php+mysql)
    [转]最值得拥有的免费Bootstrap后台管理模板
    Got a packet bigger than 'max_allowed_packet' bytes”
    ECshop商城程序常见的96个小问题汇总
    linux 命令
    mysql 存储过程
    千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
  • 原文地址:https://www.cnblogs.com/hello-wei/p/12012755.html
Copyright © 2020-2023  润新知