声明
以下讨论将区别方法(method)和函数(function)两个概念,方法依托于对象,而函数可以脱离对象之外存在。

众所周知,python类中的方法有是两个注解(annotation):

  1. @statismethod:将方法标记为静态方法
  2. @classmethod:将方法标记为类方法,首参数为类(通常命名为cls)
  3. 什么也不写:对象方法,首参数为对象本身(通常命名为self,类似Java的this)

如何使用

(吐槽下CSDN的列表缩进真是垃圾)

  • 静态方法:

    • {类名}.{函数名}
    • {对象名}.{函数名} 或者 self.{函数名}
  • 类方法

    • {类名}.{函数名}
    • {对象名}.{函数名} 或者 self.{函数名}
  • 对象方法

    • {对象名}.{函数名} 或者 self.{函数名}
  • talk is cheap, show me the code
class Student():@staticmethoddef create_name():return "mike"@classmethoddef describe_my_type(cls):print(cls.__name__)  # 调用了魔法方法def hello(self):self.name = self.create_name()print("i am student, my name is %s" % self.name)a = Student()
# 静态方法调用
create_name()  # 编译不通过
Student.create_name()
a.create_name()# 类方法调用
Student.describe_my_type()
a.describe_my_type()# 对象方法调用
a.hello()

注意避坑

Python中静态方法的初始化和Java不一样!
Java中由于方法、函数全部依托于类和对象,所以对于静态方法的初始化优先级最高。
而Python静态方法其实就是普通函数,所以初始化晚于对象方法(基于声明顺序)。如果未事先声明是无法调用的。
同一类中Java的加载顺序优先级:静态方法=类方法>对象方法
同一类中Python的加载顺序优先级:类方法>对象方法>静态方法

建议

Python的类中不要些statismethod,就用classmethod。statismethod放到外面单独作为函数定义。

像这样

def create_name():print("mike")return "mike"class Student():    @classmethoddef describe_my_type(cls):print(cls.__name__)def hello(self):self.name = self.create_name()print("i am student, my name is %s" % self.name)

[Python基础] @statismethod和@classmethod中的注意事项相关推荐

  1. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习

    Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习 目录 Python 基础 之 jupyter notebook 中机器学习的简单入门书写 ...

  2. 【Python基础】在pandas中利用hdf5高效存储数据

    1 简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式. 其文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一 ...

  3. python基础知识测试题_Python中的单元测试—基础知识

    python基础知识测试题 Unit testing is the number one skill which separates people who just finished their de ...

  4. 【Python基础】在pandas中使用pipe()提升代码可读性

    1 简介 我们在利用pandas开展数据分析时,应尽量避免过于「碎片化」的组织代码,尤其是创建出过多不必要的「中间变量」,既浪费了「内存」,又带来了关于变量命名的麻烦,更不利于整体分析过程代码的可读性 ...

  5. Python基础——@staticmethod与@classmethod

    @staticmethod与隐式的静态成员方法的区别在于是否允许实例对象调用该静态方法(后者是不允许的) @staticmethod与@classmethod的区别在于后者无论是被实例调用还是被类对象 ...

  6. Python基础教程:字符串中split与rsplit的方法原理教程

    1.描述 split()方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等 rstrip()方法通 ...

  7. Python基础教程:json中load和loads区别

    相同点 dump 和 dumps 都实现了序列化 load 和 loads 都实现反序列化 变量从内存中变成可存储或传输的过程称之为序列化 序列化是将对象状态转化为可保存或可传输格式的过程. 变量内容 ...

  8. Python基础教程:list中的append()和extend()方法区别

    一.append()和extend()方法都是用来添加数据到list末尾的,两者的区别: append()添加的时候会把添加的数据当成一个整体进行添加,允许添加任意类型的数据 extend()添加的时 ...

  9. 【Python基础】在pandas中使用数据透视表

    文章来源于Python大数据分析,作者朱卫军 什么是透视表? 经常做报表的小伙伴对数据透视表应该不陌生,在excel中利用透视表可以快速地进行分类汇总,自由组合字段聚合计算,而这些只需要拖拉拽就能实现 ...

最新文章

  1. ECMAScript6——Set数据结构
  2. 斯坦福2019秋季课程CS224W
  3. 机器学习的理论知识点总结
  4. 6、Fiddler的基本界面
  5. hdu1166 敌兵布阵 线段树
  6. 跨域两种解决方案CORS以及JSONP
  7. 分布式存储ceph——(3)ceph常用命令
  8. win11+vs2022配置ceres库
  9. 北京的交通无奈!!!
  10. 《软件测试过程改进》读书笔记
  11. 百家号素材审核规范说明
  12. 职场小人拉帮结派被孤立要如何处理
  13. cl.clcl.news/index.php,公布一些后门网址
  14. ECL、LVDS和CML电平
  15. 解决XWPFRun的addPicture方法无法显示图片的问题
  16. 表白代码c语言,C语言告白代码,一闪一闪亮晶晶~
  17. 几种网站压力测试工具调研与使用
  18. 图纸加密软件应用的领域有哪些?
  19. 国内网站的alex排名
  20. 已知公钥pubkey,进行RSA公钥加密

热门文章

  1. android 调用搜狗地图api,搜狗地图api 问题
  2. ZYJ7道岔控制电路图【铁路信号技术专栏】--转自微信公众号铁路信号技术交流
  3. 【昇腾AI系列】在Atlas200DK上运行第一个样例
  4. C# 实现FTP文件的上传和下载
  5. python做金融数据分析师_金融数据分析师的工作职责描述
  6. 浅谈华为验厂对MES系统的要求
  7. Java 接口概述(interface)
  8. stata 画图碎片
  9. 饭来张口即可 机械臂为行动不便者提供进食新方式
  10. 【微信小程序】小程序与服务端的http通信