浅谈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中关于日期时间处理的问答集锦
Mar 08 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python利用dir函数查看类中所有成员函数示例代码
Sep 08 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
python遍历小写英文字母的方法
Jan 02 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
pycharm安装及如何导入numpy
Apr 03 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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
PHP文件操作实现代码分享
2011/09/01 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
window.location.hash 属性使用说明
2010/03/20 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
JavaScript中模拟实现jsonp
2015/06/19 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
用原生js做单页应用
2017/01/17 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
python实现电脑自动关机
2018/06/20 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
元旦晚会主持词
2014/03/24 职场文书
心理健康活动总结
2014/04/30 职场文书
一个都不能少观后感
2015/06/04 职场文书
新年祝酒词大全
2015/08/11 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书