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

枫铃4年前 (2021-07-10)Python262

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

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

#!/usr/bin/python
# -*- coding:utf-8 -*-

def foo(x):
    print  "running  (%s)" % x

foo("test")`在这里插入代码片`

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/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。这些方法和类相关,但是又不需要类和实例中的任何信息、属性等等。

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/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()

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。