当前位置: 首页 > 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访问控制
  • $translatePartialLoader加载失败及解决方式
  • 11111111
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • go append函数以及写入
  • Mysql优化
  • Otto开发初探——微服务依赖管理新利器
  • ReactNative开发常用的三方模块
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 闭包--闭包作用之保存(一)
  • 高性能JavaScript阅读简记(三)
  • 机器学习学习笔记一
  • 解析 Webpack中import、require、按需加载的执行过程
  • 王永庆:技术创新改变教育未来
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用jquery写贪吃蛇
  • 再谈express与koa的对比
  • Java总结 - String - 这篇请使劲喷我
  • UI设计初学者应该如何入门?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ###STL(标准模板库)
  • $ git push -u origin master 推送到远程库出错
  • (2)Java 简介
  • (3)nginx 配置(nginx.conf)
  • (笔试题)合法字符串
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)Hibernate的二级缓存
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (算法)N皇后问题
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)重识new
  • ***利用Ms05002溢出找“肉鸡
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net经典笔试题
  • .NET业务框架的构建
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [1181]linux两台服务器之间传输文件和文件夹