当前位置: 首页 > news >正文

@staticmethod和@classmethod的作用与区别

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


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


既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

    - 

@staticmethod 不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

    - 

@classmethod 也不需要self参数,但第一个参数需要是表示自身类的cls参数。

    - 

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 

    - 

普通对象方法至少需要一个self参数,代表类对象实例

    - 

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像Test.foo()


如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。


代码示例:

#!/usr/local/python3/bin/python3

class Door(object):
    a = 1
    def __init__(self,num,status):
        self.num = num
        self.status = status
    def open(self):
        self.var = 0
        self.status = 'open'
    def close(self):
        self.status = 'closed'
    def __test(self):
        print ('__test')

    @classmethod
    def test(cls):
        print("class test")
#不需要self参数,但第一个参数需要是表示自身类的cls参数。        
        print(cls.a)

    @staticmethod
    def test2():
        print("static test2")
#不需要自身对象参数,直接使用类名+类变量调用        
        print(Door.a)
        
Door.test()
d1 = Door(1,"closed")
d1.test()
#通过类名调用和通过实例调用
d2 = Door(2,"closed")
Door.test2()
d2.test2()


输出结果:

wKiom1XLeBPTZxUPAABmL6p9YFE210.jpg

相关文章:

  • 揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)
  • 盒模型一二三(一):盒世界,知几何
  • 利用工厂模式实现Dao层和Service的解耦
  • [LeetCode]Multiply Strings
  • 11g rac配置scan ip
  • jQuery属性,方法操作
  • 深入理解Linux内核-信号
  • 1.1JVM
  • 十进制转二进制
  • Android 工作随记
  • CRB and String
  • CoCoaPods
  • Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]
  • Hexo 个人博客搭建
  • 2.4-Apache访问控制
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • canvas 五子棋游戏
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java深入 - 深入理解Java集合
  • learning koa2.x
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 对象引论
  • 复习Javascript专题(四):js中的深浅拷贝
  • 前端存储 - localStorage
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ![CDATA[ ]] 是什么东东
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #FPGA(基础知识)
  • #includecmath
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)构建dubbo分布式平台-平台功能导图
  • (过滤器)Filter和(监听器)listener
  • (黑马C++)L06 重载与继承
  • (四)Controller接口控制器详解(三)
  • (一)u-boot-nand.bin的下载
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ******之网络***——物理***
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net连接oracle数据库
  • .net流程开发平台的一些难点(1)
  • :“Failed to access IIS metabase”解决方法
  • ?.的用法
  • [ 蓝桥杯Web真题 ]-布局切换
  • [100天算法】-不同路径 III(day 73)
  • [20150707]外部表与rowid.txt
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]创建TabBar
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [codevs 1515]跳 【解题报告】
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径