静态方法和类方法

Python类包含三种方法:实例方法、静态方法和类方法。其中,实例方法在前面的章节已经多次使用了。要想调用实例方法,必须要实例化类,然后才可以调用。也就是说,调用实例化方法需要类的实例(对象)。而静态方法在调用时根本不需要类的实例(静态方法不需要self参数),这一点和其他编程语言完全一样。

类方法的调用方式与静态方法完全一样,所不同的是,类方法与实例方法的定义方式相同,都需要一个self参数,只不过这个self参数的含义不同。对于实例方法来说,这个self参数就代表当前类的实例,可以通过self访问对象中的方法和属性。而类方法的self参数表示类的元数据,也就是类本身,不能通过self参数访问对象中的方法和属性,只能通过这个self参数访问类的静态方法和静态属性。

定义静态方法需要使用@staticmethod装饰器(decorator),定义类方法需要使用@classmethod装饰器。

class Myclass:# 实例方法def instancemethod(self):pass# 静态方法@staticmethoddef staticmethod():pass# 类方法@classmethoddef classmethod(self):pass

[例 10.9] 本例演示了如何定义实例方法、静态方法和类方法,并演示了如何调用这些方法

class Myclass:# 定义一个静态变量,可以被静态方法和类方法访问name = 'Bill'def __init__(self):print('Myclass的构造方法被调用')# 定义实例变量,静态方法和类方法不能访问该变量self.value = 20# 定义静态方法@staticmethoddef run():# 访问Myclass类中的静态变量nameprint('*', Myclass.name, '*')print('Myclass的静态方法run被调用')# 定义类方法@classmethod# 这里self是类的元数据,不是类的实例def do(self):print(self)# 访问Myclass类中的静态变量nameprint('[', self.name, ']')print('调用静态方法run')self.run()# 在类方法中不能访问实例变量,否则会抛出异常(因为实例变量需要用类的实例访问) print(self.value)print('成员方法do被调用')# 定义实例方法def do1(self):print(self.value)print('<', self.name, '>')print(self)
# 调用静态方法run
Myclass.run()
# 创建Myclass类的实例
c = Myclass()
# 通过类的实例也可以调用类方法
c.do()
# 通过类访问类的静态变量
print('Myclass2.name', '=', Myclass.name)
# 通过类调用类方法
Myclass.do()
# 通过类的实例访问实例方法
c.do1()

输出结果:

* Bill *
Myclass的静态方法run被调用
Myclass的构造方法被调用
<class '__main__.Myclass'>
[ Bill ]
调用静态方法run
* Bill *
Myclass的静态方法run被调用
成员方法do被调用
Myclass2.name = Bill
<class '__main__.Myclass'>
[ Bill ]
调用静态方法run
* Bill *
Myclass的静态方法run被调用
成员方法do被调用
20
< Bill >
<__main__.Myclass object at 0x10d5bcd30>

从实例方法、静态方法和类方法的调用规则可以得出以下结论:

通过实例定义的变量只能被实例方法访问,而直接在类中定义的静态变量(如本例的name变量)即可以被实例方法访问,也可以被静态方法和类方法访问。实例方法不能被静态方法和类方法访问,但静态方法和类方法可以被实例方法访问。

Python进阶之路 静态方法和类方法相关推荐

  1. Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)

    前言 大家好,今天想和大家分享一下我的itertools学习体验及心得,itertools是一个Python的自带库,内含多种非常实用的方法,我简单学习了一下,发现可以大大提升工作效率,在sf社区内没 ...

  2. Python 进阶之路 (十二) 尾声即是开始

    Python进阶之路总结 大家好,我的<< Python进阶之路>>到这一期就到此为止了,和 <<Python 基础起步>>不同,在掌握了一些基础知识后 ...

  3. Python 进阶之路 (八) 最用心的推导式详解 (附简单实战及源码)

    什么是推导式 大家好,今天为大家带来问我最喜欢的Python推导式使用指南,让我们先来看看定义~ 推导式(comprehensions)是Python的一种独有特性,推导式是可以从一个数据序列构建另一 ...

  4. 毛毛Python进阶之路6——MySQL 数据库(二)

    毛毛Python进阶之路6--MySQL 数据库(二) 一.对于自增 show create table 表名; # 查看表是怎样创建的. show create table 表名\G; #将某个表旋 ...

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

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

  6. Python进阶之路第一话之python引力

    Python的魅力:我来引你中毒 我不想说一些Python是世界最好的编程语言之类的鬼话,在我看来,每一种编程语言都有他们各自擅长的领域和不擅长的领域.举个例子,我用一根针,来削铅笔,很费劲不能实现, ...

  7. 《正规军的Python进阶之路|Python技能树测评》

    通过<Python技能树测评>判断自己在哪个级别: Python技能树测评[https://bbs.csdn.net/skill/python] 完整的[Python]学习体系,给你正规军 ...

  8. Python进阶之路 3.4.2 条件语句(if、else和elif)

    3.4.2 条件语句(if.else和elif) 对于计算机程序来说,要学会第一项技能就是"判断",也就是根据不同的条件,执行不同的程序分支,这样的程序才有意义. if语句的作用就 ...

  9. Python进阶之路:namedtuple

    Python中的tuple大家应该都非常熟悉了.它可以存储一个Python对象序列.与list不同的是,你不能改变tuple中元素的值.tuple的元素是通过索引进行访问的: Tuple还有一个兄弟, ...

最新文章

  1. 专访|黄铁军:人工智能不会以人为中心,但不要为此失落
  2. xrdp安装包linux,linux xrdp0.6 安装
  3. 操作系统第四章-文件管理
  4. 自动平衡男女比例的随机分组软件B2G使用教程,献给组织
  5. WKWebView概述
  6. 阿里云python服务器_Python服务器
  7. spring boot 整合 mybatis
  8. 如何使用extern在源文件之间共享变量?
  9. python处理excel的优势-用Python读写Excel文件的方式比较
  10. tpadmin导入数据库问题
  11. Idea返回上一步快捷键是什么
  12. Windows安装--拼音分词器
  13. win7电脑访问共享提示“您可能没有权限使用网络资源”的解决技巧--win10专业版
  14. MySQL DUAL表的作用
  15. MySQL高级(一)
  16. Swift基础(六)解包
  17. K - Kinds of Fuwas----(2015 summer training #4 (Qualifying))
  18. 8款炫酷的HTML5特效源码
  19. Cmake传入项目版本号
  20. 基于javaweb+jsp的在线点餐系统(java+SSM+jsp+mysql+maven)

热门文章

  1. php删除文件夹(临时文件)代码
  2. 这个报表工具绝了!能做GIS数据地图,还能集成R语言!
  3. Anchor DETR
  4. amazon白皮书学习 II
  5. 坚持是一种可怕的力量,一年半原创文章,关心到每一位程序员
  6. python dataset[trans_科学网—Python GDAL 图像坐标,投影坐标,经纬度坐标 三者映射及运行错误解决 - 吴妍潼的博文...
  7. SpringAop之joinPoint讲解
  8. 关于「珠海木言」:能给你贡献关于进口板全屋定制的什么价值?
  9. 中信集团张波:信息化已经过去,数字化刚刚到来
  10. 蓝牙 舵狗 openmv通信相关