1.概述

Python中定义在类中的函数称作方法,  可以通过装饰器@staticmethod  和@classmethod将其转换成静态方法, 和类方法.

本文将通过实例帮大家理解其中的区别, 以便明确他们的使用场景, 可以熟练使用来写出更易于维护的代码。

让我们首先编写一个类,其中包含所有三种方法类型的简单示例:

class Demo:def method(self, x):print("instance mathod", self, x)@classmethoddef klass(cls, x):   # 第一个参数是clsprint("instance mathod", cls, x)@staticmethoddef static(x):        # 没有self 或 cls参数print("instance mathod", x)demo = Demo()

1. 实例方法

第一个方法method,是一个常规实例方法。这是我们大部分时间都会使用的基本的方法类型。可以看到该方法接受一个参数,self,该参数指向demo(该方法被调用时的实例对象).

通过self参数,实例方法可以自由访问同一对象上的属性和其他方法.

>>> demo.method(1)
instance mathod:  <__main__.Demo object at 0x0000021BDC4864C8> 1

通过 <instance>.<method> 语法调用实例方法时, Python隐式的将实例对象赋值给self参数. 等价于class.method(instance)

>>> Demo.method(demo, 1)
instance mathod:  <__main__.Demo object at 0x0000021BDC4864C8> 1

2. 类方法

将实例方法method和类方法klass对比, 发现类方法第一个参数不是self,而是cls指向类而非对象实例的参数. cls指向的类对象而不是实例.

类对象不能调用实例方法, 可以直接调用类方法, 调用类方法时, 隐式的将类对象赋值给cls参数.

>>> Demo.klass(1)
instance mathod:  <class '__main__.Demo'> 1

实例对象也可以调用类方法

>>> demo.klass(1)
instance mathod:  <class '__main__.Demo'> 1

什么时候使用类方法?

类方法的常见使用场景,作为工厂函数创建实例对象

class Pizza:def __init__(self, ingredients):self.ingredients = ingredientsdef __repr__(self):return f'Pizza({self.ingredients!r})'@classmethoddef margherita(cls):return cls(['mozzarella', 'tomatoes'])@classmethoddef prosciutto(cls):return cls(['mozzarella', 'tomatoes', 'ham'])

3. 静态方法

使用@staticmethod装饰器的方法被转换为静态方法, 这种类型的方法既不接受 self也不接受cls参数。静态方法可以理解为定义在类作用域内的一个函数, 而不是方法. 可以通过类和实例对象直接调用

>>> demo.static(2)  # 通过实例调用
instance mathod:  2>>> Demo.static(2)  # 通过类调用
instance mathod:  2

什么时候使用静态方法?

静态方法只是名义上归这个类管理, 为什么放到类里面呢, 一个原因是为了增加可读性.

class Dates:def __init__(self, date):self.date = date@staticmethoddef to_dash_date(date):return date.replace("/", "-")@staticmethoddef to_slash_date(date):return date.replace("-", "/")

另一个使用场景, 当父类中的有些方法不希望类的子类更改/覆盖方法的特定实现时,使用静态方法

2. 对比

方法类型 被实例调用 被类调用 访问实例属性 访问类属性
实例方法
类方法
静态方法

总结:

  1. 实例方法需要一个类实例, 可以通过self访问实例对象的方法和属性
  2. 类方法不需要实例, 可以通过cls访问类的属性和类方法
  3. 静态方法不能访问clsself, 它们像常规函数一样工作,但属于类的命名空间。

理解method(实例方法), staticmethod(静态方法)和classmethod(类方法)的区别相关推荐

  1. Python 类—类属性(私有属性、公有属性、实例属性、局部变量)类方法(实例方法、静态方法)

    1. 创建类 类是对某个对象的定义,它包含有关对象动作方式的信息,包括它的名称.方法.属性和事件.类不存在于内存中,因此它本身并不是对象.当程序运行需要引用类的代码时,就会在内存中创建一个类的新实例, ...

  2. python用类名直接调用方法_Python类的实例方法、静态方法、类方法详解,附代码示例...

    实例方法 普通实例方法(instance method),第一个参数需要是self,它表示一个具体的实例本身,只能被实例对象调用,通过self引用的可能是类属性.也有可能是实例属性. 实例方法访问类属 ...

  3. python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...

    和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法.实例方法和静态方法. 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为 ...

  4. python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...

    1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()& ...

  5. 实例方法、静态方法和类方法的区别

    方法包括:实例方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 实例方法:由对象调用:至少一个self参数:执行实例方法时,自动将调用该方法的对象赋值给self: 类方法:由 ...

  6. python 实例方法、静态方法、类方法应用场景

    python 实例方法.静态方法.类方法应用场景 百雨于 2019-01-16 09:13:40 发布3201 收藏 20 分类专栏: python ​python专栏收录该内容 77 篇文章1 订阅 ...

  7. python学习-类(类方法、实例方法、静态方法)

    文章目录 基础知识补充 类方法.实例方法.静态方法 基础知识补充 Python面向对象-访问权限public和private 可以在属性的名称前面加上两个下划线__.如果一个变量以__开头,就变成了一 ...

  8. python 实例方法和类方法的区别_python中实例方法,类方法和静态方法的区别。...

    实例方法,必须要创建实例才能调用,里面有self关键字,有初始化函数必须对初始化函数进行传参. 类方法,可以直接类名.方法名直接调用,也可以创建实例调用.里面有cls关键字,调用时,直接类名.方法名, ...

  9. python 之实例方法、静态方法和类方法

    方法包括:实例方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方法不同. 实例方法:由对象调用,至少有一个self参数:执行实例方法时,自动将调用该方法的对象赋值给self: 类方法: ...

最新文章

  1. 清华博士接亲被要求现场写代码,网友:真是面向对象编程!
  2. linux 7个运行级别 runlevel 简介
  3. 在两个页面之间互相写其控件内的值
  4. Idea配置spark环境及编写scala代码
  5. 探索Julia(part7)--数组与字典函数
  6. java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...
  7. 03Oracle Database 物理结构,逻辑结构
  8. 前端多行文本溢出问题解决方案
  9. 小程序入门学习20--springboot之集成mybatis
  10. halcon 差异模型 异物_基于HALCON的形状匹配算法的研究和心得总结
  11. 7天内新闻前加 new
  12. 产品经理如何搞定客户和业务
  13. java前端编译和后端编译理解
  14. 蓝桥杯2022年第十三届决赛真题-迷宫
  15. python怎么测试一个网站的延迟_Python检测网络延迟的代码
  16. Python map() 函数 特殊用法
  17. TRECVID2005 Overview
  18. windows安装ROS
  19. 实施:GitHub + MarkDown 文档系统的工作环境部署及工作流程说明 | 技术传播
  20. How to increase the JES2 spool size

热门文章

  1. VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】
  2. 百万人同时涌入冲顶大会,如何才能保障流畅性?
  3. 【转】孩子们应该学习的9种基本技能
  4. 怎样测量地图上曲线的长度_长度测量的五种方法
  5. Cucumber介绍
  6. html中矩形坐标,js怎么根据坐标在图片上画出矩形框?
  7. python 单机程序_Python tkinter制作单机五子棋游戏
  8. Google Chrome 64位测试版 中文乱码 不显示
  9. Python爬虫编程6——selenium
  10. matlab怎么运行电路图,电工原理的MATLAB实现