浅谈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实现的一个简单LRU cache
Sep 26 Python
python实现实时监控文件的方法
Aug 26 Python
git进行版本控制心得详谈
Dec 10 Python
Python基于高斯消元法计算线性方程组示例
Jan 17 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
python 移除字符串尾部的数字方法
Jul 17 Python
Python数据类型之Number数字操作实例详解
May 08 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
python中rc1什么意思
Jun 19 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
15种PHP Encoder的比较
2007/03/06 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
js运动事件函数详解
2016/10/21 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
基于python绘制科赫雪花
2018/06/22 Python
浅析python的优势和不足之处
2018/11/20 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
详解Python yaml模块
2020/09/23 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
领导班子作风建设年个人整改措施
2014/09/29 职场文书
教师节获奖感言
2015/07/31 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
Python使用scapy模块发包收包
2021/05/07 Python