理解method(实例方法), staticmethod(静态方法)和classmethod(类方法)的区别
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. 对比
方法类型 | 被实例调用 | 被类调用 | 访问实例属性 | 访问类属性 |
实例方法 | ✅ | ❌ | ✅ | ✅ |
类方法 | ✅ | ✅ | ❌ | ✅ |
静态方法 | ✅ | ✅ | ❌ | ❌ |
总结:
- 实例方法需要一个类实例, 可以通过self访问实例对象的方法和属性
- 类方法不需要实例, 可以通过cls访问类的属性和类方法
- 静态方法不能访问
cls
或self
, 它们像常规函数一样工作,但属于类的命名空间。
理解method(实例方法), staticmethod(静态方法)和classmethod(类方法)的区别相关推荐
- Python 类—类属性(私有属性、公有属性、实例属性、局部变量)类方法(实例方法、静态方法)
1. 创建类 类是对某个对象的定义,它包含有关对象动作方式的信息,包括它的名称.方法.属性和事件.类不存在于内存中,因此它本身并不是对象.当程序运行需要引用类的代码时,就会在内存中创建一个类的新实例, ...
- python用类名直接调用方法_Python类的实例方法、静态方法、类方法详解,附代码示例...
实例方法 普通实例方法(instance method),第一个参数需要是self,它表示一个具体的实例本身,只能被实例对象调用,通过self引用的可能是类属性.也有可能是实例属性. 实例方法访问类属 ...
- python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...
和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法.实例方法和静态方法. 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为 ...
- python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()& ...
- 实例方法、静态方法和类方法的区别
方法包括:实例方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 实例方法:由对象调用:至少一个self参数:执行实例方法时,自动将调用该方法的对象赋值给self: 类方法:由 ...
- python 实例方法、静态方法、类方法应用场景
python 实例方法.静态方法.类方法应用场景 百雨于 2019-01-16 09:13:40 发布3201 收藏 20 分类专栏: python python专栏收录该内容 77 篇文章1 订阅 ...
- python学习-类(类方法、实例方法、静态方法)
文章目录 基础知识补充 类方法.实例方法.静态方法 基础知识补充 Python面向对象-访问权限public和private 可以在属性的名称前面加上两个下划线__.如果一个变量以__开头,就变成了一 ...
- python 实例方法和类方法的区别_python中实例方法,类方法和静态方法的区别。...
实例方法,必须要创建实例才能调用,里面有self关键字,有初始化函数必须对初始化函数进行传参. 类方法,可以直接类名.方法名直接调用,也可以创建实例调用.里面有cls关键字,调用时,直接类名.方法名, ...
- python 之实例方法、静态方法和类方法
方法包括:实例方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方法不同. 实例方法:由对象调用,至少有一个self参数:执行实例方法时,自动将调用该方法的对象赋值给self: 类方法: ...
最新文章
- Shell中的Wget 的用法
- 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理
- 力扣刷题【20,21,26,27,35】
- mysql怎么添加约束成绩_mysql怎么添加约束?
- Pem私钥pkcs1和pkcs8之间互转
- html中怎么设置一个籍贯选择,行政区、籍贯选择标签
- 「补课」进行时:设计模式(2)——通过一个超级汽车工厂来了解工厂模式
- 大兴机场临空区爆出大规划!
- 音频打不开 服务器运行失败,win7系统提示音频服务器未运行的解决方法
- 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
- Amazon亚马逊卖家设置World First(WF卡)收款教程!
- 银联商务管理层换血:光大控股后撤,曾因违规被罚没3267万元
- 镭速传输安全设计第三篇:传输安全设计
- 一文讲解Typescript中工具类型
- 怎么保护MacBook的电池?Mac电池最大充电限制工具AlDente Pro来帮您
- 开根号向下取整代码实现
- 关于com.lowagie.text包的报错问题
- SQL SERVER练习题及答案2
- 用递归算法实现赶鸭子问题和角谷定理
- Landsat8、GF-1、GF-2等遥感影像真彩色假彩色影像特征
热门文章
- HUAWEI MateBook D 2018 黑苹果BigSur的安装
- AD域创建用户无法登录
- 全球最为“绿色”的一家星巴克门店9月30日在上海开业
- 计算机在财务会计中的应用浅论,浅析excel在会计中的应用(实际应用版).pdf
- 从SVN上检出项目转换为maven项目失败
- amd64上编译pcl报错undefined reference to `png_init_filter_functions_neon‘
- 改变VC++应用程序单文档标题图标
- Android Toast类
- SPSS下载以及安装
- 【网络教程】SSR地址的组成分析,组成公式干货!