详解python中@classmethod和@staticmethod方法
作者:shaoyishi 发布时间:2022-10-24 11:47:16
标签:python,@classmethod,@staticmethod
在python类当中,经常会遇到@classmethod和@staticmethod这两个装饰器,那么到底它们的区别和作用是啥子呢?具体来看下。
@classmethod :默认有一个cls参数,用类或对象都可以调用。
@staticmethod:静态方法,无默认参数,用类和对象都可以调用。
1.@staticmethod:
我们看下代码:
class A:
def f1(x):
print(x)
A.f1(2) # 2 类.函数
创建一个类,通过类调用函数。
class A:
@staticmethod
def f1(x):
print(x)
A.f1(2) # 2 类.静态方法
A().f1(2) # 2 对象.静态方法 这种情况下是可以执行的,如果上述f1没有被staticmethod装饰那么就会报错!!!
创建一个类,通过类调用函数。同时,因为该方法被staticmethod装饰器装饰了,那么通过对象.方法也是可以调用的。
所以在类中,通过@staticmethod装饰的函数,可以直接被类调用,也可以被实例化后的对象调用!!!
同时,发现@staticmethod装饰的函数根本不需要传递self这个参数。因为被@staticmethod装饰的函数是直接绑定在类上而不是对象上。
2.@classmethod:
class A:
@classmethod
def f1(cls,x):
print(x)
A.f1(2) # 2 类.方法
A().f1(2) # 2 对象.方法
创建一个类,通过类调用函数。同时,因为该方法被classmethod装饰器装饰了,那么通过对象.方法也是可以调用的。但注意,在被装饰方法中,必须传递cls参数!!!
class B:
name = 'bruce'
age = 16
@classmethod
def f1(cls,x):
print(x)
print(cls.age)
print(cls.name)
B().f1(1)
# 1
# 16
# bruce
上述中,说明被classmethod装饰后的方法,通过cls参数,在该方法中,可以调用该类的属性。
class C:
@classmethod
def f1(cls,x):
print(x)
cls().f2()
def f2(self):
print('hello world')
C.f1(1) 或者 C().f1(1)# 1<br># hello world
上述中,说明被classmethod装饰后的方法,通过cls参数,在该方法中,可以调用该类的其他方法。
所以在类中,通过@classmethod装饰的函数,首先在方法中必须传递第一个参数cls, 该函数可以被类直接调用,也可以被对象调用!!!
同时,因为传递了一个cls,所以可以调用类中的其他属性和方法。
来源:https://www.cnblogs.com/shaoyishi/p/16790680.html


猜你喜欢
- 一般情况下,使用pip命令安装即可:[root@dthost27 ~]# pip install mysql-python但是在实际工作环境
- 目录0x01 字符串(string)引号转义拼接字符串长字符串索引( indexing)运算符in创建列表切片赋值0x02 字符串格式化模板
- forEach()函数从头到尾把数组遍历一遍。有三个参数分别是:数组元素,元素的索引,数组本身(如果是一个参数就是数组元素,也就是数组的值。
- 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件
- 一、绘制折线图import seaborn as snsimport numpy as npimport pandas as pdimpor
- 今天发现一个google广告的另类调用方法function addGoogel (content, obj) { addScript(
- Python用Pillow(PIL)进行简单的图像操作方法颜色与RGBA值计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透
- 使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下# -*-coding: utf-8 -*-""
- 各位大家好!很荣幸能在这里和大家聊聊!(*^__^*) 嘻嘻……此处省略488字,切入正题。关于网页设计这个行业,在中国来讲这个行业并不成熟
- SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,a
- IN为什么慢?在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕。例如:SELECT driver_id FROM driver w
- 本文实例为大家分享了python遍历文件目录、批量处理同类文件的具体代码,供大家参考,具体内容如下目录操作1、获取当前目录import os
- 1.MySQL的安装(1)双击我们去官网下载好的MySQL(2) 一直点下一步,直到遇到以下界面(3)选择Typical,会进行跳转,点击I
- 以下的文章主要是对MySQL limit查询优化的具体内容的介绍,我们大家都知道MySQL数据库的优化是相当重要的。其他最为常用也是最为需要
- 一、匹配版本基于Camunda 7.16.0 + Springboot 2.5.8首先我们去官网找到camunda7.16对应的spring
- Djangos 内置的模板加载器(在先前的模板加载内幕章节有叙述)通常会满足你的所有的模板加载需求,但是如果你有特殊的加载需求的话,编写自己
- 在做项目时发现,很多场合都可能用到Input但又想让它具有select的特性,研究了一下,似乎可以实现,下面的代码可以大概说明我的意图,但实
- 操作所涉及的文件都在当前用户下面的隐藏文件:1. 打开Anaconda Prompt(如果之前生成过Config配置文件则不需要第一步)终端
- 文件可以传输,但是对比传输前后的文件:socket_test.txt,末尾有一些不一致服务端代码:#!/usr/bin/python# -*
- 前言原理:Windows逆向,通过内联汇编的形式调用发消息的函数下面的代码PC微信版本是:3.7.0.26 , python使用的32位的3