浅谈python 类方法/静态方法


Posted in Python onSeptember 18, 2020

1.类方法

类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:

@classmethod
def 类方法名(cls [, 形参列表]):
	方法体

要点如下:

  1. @classmethod必须位于方法的上面一行
  2. 第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
  3. 调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
  4. 类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
  5. 子类继承父类方法时,传入cls是自身对象,而非父类对象。(后面的笔记会有介绍)

代码示例:

class Student:
  count = 0    # 类属性

  """定义方法"""
  @classmethod
  def print_count(cls):
    """cls参数代表类对象"""
    print(Student.count)


"""调用类方法"""
print("调用时,不传递cls参数")
Student.print_count()

运行结果:

调用时,不传递cls参数
0

2.静态方法

在python中,允许定义于”类对象“无关的方法,称为"静态方法"。
"静态方法"和在模块中定义的普通方法没有什么区别,只不过"静态方法"放到了"类的名字变量空间",需要通过类调用。
静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):
	方法体

要点如下:

  1. @staticmethod必须位于方法上面一行
  2. 调用静态方法格式:类名.静态方法名(参数列表)
  3. 静态方法中访问实例属性和实例方法会导致错误

代码示例:

class Student:
  count = 0      # 类属性

  @staticmethod
  def add(a, b):
    """与类无关的静态方法"""
    """因为静态方法从属于类,所以是可以操作类属性和类方法"""
    print("{0}+{1}={2}".format(a, b, a+b))
    return a + b


# 调用静态方法
Student.add(20, 30)

运行结果:

20+30=50
res=50

3.实例方法/类方法/静态方法的区别

class MyClass:
  # 类属性
  class_attr = 0

  def __init__(self, obj_attr):
    self.obj_attr = obj_attr

  def instance_method(self):
    return "instance method called", self

  @classmethod
  def class_method(cls):
    return "class method called", cls

  @staticmethod
  def static_method():
    return "static method called"


print("调用实例方法")
obj1 = MyClass("obj_attr1")
print(obj1.instance_method())

print("--" * 20)
print("调用类方法")
print(MyClass.class_method())

print("--" * 20)
print("调用静态方法")
print(MyClass.static_method())

运行结果:

调用实例方法
('instance method called', <__main__.MyClass object at 0x10ca93310>)
----------------------------------------
调用类方法
('class method called', <class '__main__.MyClass'>)
----------------------------------------
调用静态方法
static method called

注意: 以下讨论的属性、方法均指公开的类型,非私有的。

实例方法:

  1. 能读取、修改实例属性
  2. 能调用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数

类方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:类名.类方法名(参数列表),编译器自动传递cls参数

静态方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式: 类名.静态方法名(参数列表),不需要cls参数
  7. 类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。

以上就是浅谈python 类方法/静态方法的详细内容,更多关于类方法/静态方法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
Python按行读取文件的简单实现方法
Jun 22 Python
python django事务transaction源码分析详解
Mar 17 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Python编写一个闹钟功能
Jul 11 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
golang特有程序结构入门教程
Jun 02 Python
python 6行代码制作月历生成器
Sep 18 #Python
python 深度学习中的4种激活函数
Sep 18 #Python
python闭包与引用以及需要注意的陷阱
Sep 18 #Python
python 代码运行时间获取方式详解
Sep 18 #Python
python判断字符串以什么结尾的实例方法
Sep 18 #Python
python绘制趋势图的示例
Sep 17 #Python
Python绘制组合图的示例
Sep 18 #Python
You might like
PHP5+UTF8多文件上传类
2008/10/17 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
小学教师学期末自我评价
2013/09/25 职场文书
自我推荐信范文
2014/05/09 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
青年志愿者活动感想
2015/08/07 职场文书
小学安全教育主题班会
2015/08/12 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android