当前位置: 首页 > 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访问控制
  • 【个人向】《HTTP图解》阅后小结
  • chrome扩展demo1-小时钟
  • Cookie 在前端中的实践
  • Git初体验
  • HTTP 简介
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js对象的深浅拷贝
  • k8s 面向应用开发者的基础命令
  • Python连接Oracle
  • Wamp集成环境 添加PHP的新版本
  • Web标准制定过程
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 构建二叉树进行数值数组的去重及优化
  • 技术发展面试
  • 京东美团研发面经
  • 力扣(LeetCode)21
  • 什么软件可以剪辑音乐?
  • 手写双向链表LinkedList的几个常用功能
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 自制字幕遮挡器
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 数据库巡检项
  • #QT(一种朴素的计算器实现方法)
  • (2022 CVPR) Unbiased Teacher v2
  • (C++)八皇后问题
  • (C语言)球球大作战
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (汇总)os模块以及shutil模块对文件的操作
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)linux下的时间函数使用
  • (转)ORM
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题