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. Shell中的Wget 的用法
  2. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理
  3. 力扣刷题【20,21,26,27,35】
  4. mysql怎么添加约束成绩_mysql怎么添加约束?
  5. Pem私钥pkcs1和pkcs8之间互转
  6. html中怎么设置一个籍贯选择,行政区、籍贯选择标签
  7. 「补课」进行时:设计模式(2)——通过一个超级汽车工厂来了解工厂模式
  8. 大兴机场临空区爆出大规划!
  9. 音频打不开 服务器运行失败,win7系统提示音频服务器未运行的解决方法
  10. 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
  11. Amazon亚马逊卖家设置World First(WF卡)收款教程!
  12. 银联商务管理层换血:光大控股后撤,曾因违规被罚没3267万元
  13. 镭速传输安全设计第三篇:传输安全设计
  14. 一文讲解Typescript中工具类型
  15. 怎么保护MacBook的电池?Mac电池最大充电限制工具AlDente Pro来帮您
  16. 开根号向下取整代码实现
  17. 关于com.lowagie.text包的报错问题
  18. SQL SERVER练习题及答案2
  19. 用递归算法实现赶鸭子问题和角谷定理
  20. Landsat8、GF-1、GF-2等遥感影像真彩色假彩色影像特征

热门文章

  1. HUAWEI MateBook D 2018 黑苹果BigSur的安装
  2. AD域创建用户无法登录
  3. 全球最为“绿色”的一家星巴克门店9月30日在上海开业
  4. 计算机在财务会计中的应用浅论,浅析excel在会计中的应用(实际应用版).pdf
  5. 从SVN上检出项目转换为maven项目失败
  6. amd64上编译pcl报错undefined reference to `png_init_filter_functions_neon‘
  7. 改变VC++应用程序单文档标题图标
  8. Android Toast类
  9. SPSS下载以及安装
  10. 【网络教程】SSR地址的组成分析,组成公式干货!