浅谈python 类方法/静态方法
作者:聂发俊 发布时间:2021-02-23 07:00:54
1.类方法
类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:
@classmethod
def 类方法名(cls [, 形参列表]):
方法体
要点如下:
@classmethod必须位于方法的上面一行
第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
子类继承父类方法时,传入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 静态方法名([形参列表]):
方法体
要点如下:
@staticmethod必须位于方法上面一行
调用静态方法格式:类名.静态方法名(参数列表)
静态方法中访问实例属性和实例方法会导致错误
代码示例:
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
注意: 以下讨论的属性、方法均指公开的类型,非私有的。
实例方法:
能读取、修改实例属性
能调用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数
类方法:
不能读取、修改实例属性
不能用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式:类名.类方法名(参数列表),编译器自动传递cls参数
静态方法:
不能读取、修改实例属性
不能用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式: 类名.静态方法名(参数列表),不需要cls参数
类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。
来源:http://www.niefajun.com/archives/python-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-09-%E7%B1%BB%E6%96%B9%E6%B3%95%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95


猜你喜欢
- Django url pathDjango 路由在 urls.py 配置path('浏览器地址栏表示URL', '处
- YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。YAML类似于XML,但是语法比XML简单得多
- 1、Python数据存储(压缩)(1)numpy.save , numpy.savez , scipy.io.savematnumpy和sc
- 1、说明用于等待按钮。当用户按下按钮时,句子将被执行并获得返回值。2、语法retval=cv2.waitKey([delay])Retval
- 本文实例讲述了MySQL单表查询操作。分享给大家供大家参考,具体如下:语法一、单表查询的语法 SELECT 字段1,
- 本文实例讲述了ES6 let和const定义变量与常量的应用。分享给大家供大家参考,具体如下:关于 letlet是小作用域的变量的声明{ &
- 用法分析 在查看SRGAN源码时有如下损失函数,其中设置了retain_graph=True,其作用是什么?################
- 一、 通过runtime包进行多核设置1.NumCPU()获取当前系统的cpu核数2.GOMAXPROCS设置当前程序运行时占用的cpu核数
- USE MASTER GO IF EXISTS(SELECT * FROM dbo.sysdatabases WHERE name='
- 让ASP搭配MYSQL所需要工具mysql-4.1.11-win32 myodbc-3.51.11-1-dll myodbc-3.51.11
- 本文实例讲述了js自定义trim函数实现删除两端空格功能。分享给大家供大家参考,具体如下:兼容IE低版本浏览器,以及其他一些低版本脚本的浏览
- 1、单元测试的几个重要概念(1)Test Case一个Test Case实例是一个测试用例,完整的测试流程包括测试前准备环境的搭建(setU
- mysql字段的数据类型支持json格式,可以直接存储json数组和json对象。一、插入json数据的方式有两种1、以普通字符串形式插入,
- Django上传文件最简单最官方的方法1.配置media路径在settings.py中添加如下代码:MEDIA_ROOT =&nb
- 模拟栈Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。push(item)将一个新项添加到栈的顶部。它需要 item 做参
- 一、数据库介绍1、为什么要学习数据库通常,我们存储数据,直接用本地文件即可,但是,本地文件不利于存放海量数据,也不利于用程序对文件的数据进行
- 接上一篇终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢?尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜
- 背景在程序员的职业生涯中,总会遇到数据库表被锁的情况,前些天就又撞见一次。由于业务突发需求,各个部门都在批量操作、导出数据,而数据库又未做读
- 本文实例讲述了C#实现Excel表数据导入Sql Server数据库中的方法。分享给大家供大家参考,具体如下:Excel表数据导入Sql S
- os.path模块是os模块根据系统类型从另一个模块导入的,并非由os模块实现1、os.path.abspath(相对路径)-----返回对