第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供。

一、    静态方法定义

1.    语法

@ staticmethod 

def 方法名(参数):

方法体

2.    定义说明:

1)    上述语法定义中,@ staticmethod 称为静态方法装饰器,凡是静态方法定义都必须有该装饰器。

2)    静态方法与实例方法和类方法不同的是,没有类似self和cls这样的参数。某种程度上说,静态方法与一个类外面的函数类似。

二、    静态方法的使用

静态方法一般用在与实例和类的数据无关的场景,它提供的是一种类内的公共能力,也可以说是类内的一个与类和实例数据无关的一个类空间内的函数,静态方法实现的能力通过普通函数一样可以实现。

在某些方面,静态方法和类方法是相同的,之所以用静态方法或类方法,而不用实例方法,是因为实例方法需要进行实例化后才能使用,而静态方法和类方法不需类实例化就可以使用,这样不会因为静态方法和类方法调用就需要执行实例化去消耗CPU和内存资源。

那为什么不直接用函数呢?老猿认为,这是因为函数是在全局名称空间中创建的,如果多个成员的团队合作时,这种全局空间的函数可能会导致开发团队成员之间命名的冲突,而封装在类内就可以避免这种冲突,同时也更符合OOP的理念。

静态方法具体使用的方式如下:

1.    静态方法可以在所有类的方法中通过“类名.方法名”方式调用;

2.    静态方法可以在类方法中通过“cls.方法名”方式调用;

3.    静态方法可以在实例方法中通过“类名.方法名”方式调用;

4.    静态方法可以在实例方法中通过“self.方法名”或“self.__class__.方法名”方式调用;

1)    这种方式当类名可能修改时比直接用类名调用方便;

2)    该访问方式可以用在构造方法等实例方法中,”self.方法名”可以用在重写的__new__方法中,但“self.__class__.方法名”不能用在重写的__new__方法中。

a)    关于__ new__方法,相关内容在此不仔细介绍,大家可以到网上查一下资料,需要说明的是这也是一个实例定义时执行的方法,它在构造方法之前执行,一般不要重写该方法;

b)    “self.__class__.方法名”不能用在重写的__new__方法中是因为此时实例还没创建完成,不能正确的获取到self.__class__的值(此时self.__class__的值为<class 'type'>),而静态方法与实例无关,因此“self.方法名”可以访问;

c)    “self.__class__.方法名”是一种画蛇添足的方法,不如直接使用“self.方法名”,不推荐大家使用。

5.    静态方法可以在类定义外的调用方代码中通过“类名.方法名”方式调用;

6.    静态方法可以在类定义外的调用方代码中通过“实例名.方法名”方式调用;

7.    静态方法可以在类定义外的调用方代码中通过“实例名. __class__.方法名”方式调用,这种方式有点画蛇添足,只是在此说明一种访问方法,并不推荐使用。

从上面的使用情况介绍来说,静态方法的使用范围和类方法的使用范围是一样的,二者在这方面几乎没有差别。

本节详细介绍了类中静态方法的定义和使用方法,可以看出类方法和静态方法共性特点比较多,与类方法的主要差别在于二者装饰器不同,方法对形参的要求不同,方法与类的关联程度不同,但是方法的定义、使用基本类似。下节将结合详细的案例演示相关内容。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析的更多相关文章

  1. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  2. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  3. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑

    上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...

  4. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  5. 第8.9节 Python类中内置的查看直接父类的__bases__属性

    终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...

  6. 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义

    一.    引言 在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法.这是因为在Py ...

  7. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

  8. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  9. 第7.10节 Python类中的实例变量定义与使用

    一.    引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享 ...

随机推荐

  1. 7、Python语法之与用户交互、运算符

    一 .程序与用户交互 1.1.什么是与用户交互 用户交互就是人往计算机中input/输入数据,计算机print/输出结果. 1.2.为什么要与用户交互 为了让计算机能够像人一样与用户沟通交流. 比如, ...

  2. ashx接收前台传来的数据

    前台js: $(function () { $.ajax({ url: "/TestAshx/GetJson.ashx", type: "post", data ...

  3. C++ 基础 4:继承和派生

    1 继承和派生 在 C++ 中 可重用性是通过继承这一机制实现的.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行效率的效果. 当创 ...

  4. Canvas鼠标点击特效(富强、民主...)、收藏

    <script> /* 鼠标特效 */ var a_idx = 0; jQuery(document).ready(function($) { $("body").cl ...

  5. .NET必知的EventCounters性能指标监视器

    在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener. 使用dotnet-counters dotnet- ...

  6. Tab + Swipe+ RecyclerView + Collapsed

    随着Android的不断更新,老旧的布局页面已经过时,这就使得复杂的布局实现起来有些难度,在此记录一下手机中最常见的复杂界面实现方法. 最终效果 本文主要通过分析最新版AS下new project的S ...

  7. git命令学习之clone指定分支代码

    今天要拉取一个项目,但是是一个指定分支,本来我以为直接git clone就行,但是发现好像不能,报错: Cloning into 'lecture'...fatal: unable to update ...

  8. 深度解读最新版 Scrum 指南

    本文作者:CODING - 敏杰小王子 11 月 18 日晚,Scrum 框架的创始人 Jeff Sutherland 和 Ken Schwaber 联手发布了最新版 Scrum 指南.作为 Scru ...

  9. 消灭又臭又长的if-else

    背景 由于目前工作岗位的原因,项目还是09年建立的,历史遗留问题也比较多,加上开发规范并不是很完善,项目中有的单个方法达到成百上千行,if-else更是连续写十几个也不累. 作为强迫症真的受不了,另一 ...

  10. PVE简单迁移虚拟机

    工作中有2台PVE节点,但是没有做集群,如果有集群可以很方便的进行迁移.本次迁移的目的是: 目前有一台PVE1节点装的虚机资源使用较多,想迁移某台虚机到另一台PVE2. 1 备份 备份在web页面操作 ...