详解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,所以可以调用类中的其他属性和方法。

到此这篇关于详解python中@classmethod和@staticmethod方法的文章就介绍到这了,更多相关python中@classmethod和@staticmethod内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python @classmethod 的使用场合详解

    官方的说法: classmethod(function) 中文说明: classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,使用方法如下: class C: @classmethod def f(cls, arg1, arg2, ...): ... 看后之后真是一头雾水.说的啥子东西呢??? 自己到国外的论坛看其他的例子和解释,顿时就很明朗. 下面自己用例子来说明. 看下面的定义的一个时间类: class Data_test(object): day=0 mo

  • Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析

    本文实例讲述了Python 类方法和实例方法(@classmethod),静态方法(@staticmethod).分享给大家供大家参考,具体如下: demo.py(类方法,@classmethod): class Tool(object): # 使用赋值语句定义类属性,记录所有实例化工具对象的数量 count = 0 # @classmethod 定义类方法. 第一个参数是cls (cls用于访问类属性和类方法,不能访问实例属性/方法) @classmethod def show_tool_co

  • 详解Python中@staticmethod和@classmethod区别及使用示例代码

    本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别. 1.@staticmethod和@classmethod区别 @staticmethod:静态方法 @classmethod:类方法 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用 使用:直接类名.方法名()来调用.@staticmethod

  • 详解python中@classmethod和@staticmethod方法

    在python类当中,经常会遇到@classmethod和@staticmethod这两个装饰器,那么到底它们的区别和作用是啥子呢?具体来看下. @classmethod :默认有一个cls参数,用类或对象都可以调用. @staticmethod:静态方法,无默认参数,用类和对象都可以调用. 1.@staticmethod: 我们看下代码: class A: def f1(x): print(x) A.f1(2) # 2 类.函数 创建一个类,通过类调用函数. class A: @staticm

  • 详解Python中while无限迭代循环方法

    目录 前言 while循环 break语句 和 continue语句 else 子句 无限循环 嵌套while循环 单行 while 循环 前言 Python 有 while 语句和 for 语句作为循环处理.虽然 for 语句具有一定数量的进程,但 while 语句是『直到满足条件』类型的循环进程. 对于无限迭代 while,循环执行的次数没有事先明确指定.相反,只要满足某些条件指定的块就会重复执行. 使用定义迭代 for,指定块将被执行的次数在循环开始时已经倍明确指定. 除了 while 语

  • 详解python中index()、find()方法

    python中index().find()方法,具体内容如下: index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常.影响后面程序执行 index()方法语法:str.index(str, beg=0, end=len(string)) str -- 指定检索的字符串 beg -- 开始索引,默认为0. end --

  • 详解Python中__str__和__repr__方法的区别

    对我当前工程进行全部测试需要花费不少时间.既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保存在大内存中来加速测试的执行效率. 但优点也是缺点,tmpfs 只把结果保存在内存中,所以你必须自己编写脚本来把结果回写到磁盘上进行保留.而且这些脚本必须良好书写和执行,否则就要失去部分或全部的工作成果了. 一种常见的方法是直接在tmpfs文件夹中工作,然后把工作成果备份到磁盘上的一个文件夹中.当您的机器启动时你从那个备份文件夹恢复tmpfs文件夹.启动之后用cron同

  • 详解python中静态方法staticmethod用法

    在开发的时候, 可以使用类对方法进行封装,如果某一个方法需要访问到对象的实例属性,可以把这个方法封装成一个实例方法.如果某一个方法不需要访问对象的实例属性,但是需要访问到类的类属性,这个时候就可以考虑把这个方法封装成一个类方法.一个实例方法, 一个类方法,这是两种方法类型,但是在开发中还有一种情况,如果要封装的某一个方法,既不需要访问到对象的实例属性,也不需要访问类的类属性,这个时候就可以考虑把这个方法封装成一个静态方法. 在开发中,如果类中的某个方法既不需要访问实例属性或者调用实例方法,同时也

  • 详解python中executemany和序列的使用方法

    详解python中executemany和序列的使用方法 一 代码 import sqlite3 persons=[ ("Jim","Green"), ("Hu","jie") ] conn=sqlite3.connect(":memory:") conn.execute("CREATE TABLE person(firstname,lastname)") conn.executeman

  • 详解Python中pyautogui库的最全使用方法

    在使用Python做脚本的话,有两个库可以使用,一个为PyUserInput库,另一个为pyautogui库.就本人而言,我更喜欢使用pyautogui库,该库功能多,使用便利.下面给大家介绍一下pyautogui库的使用方法.在cmd命令框中输入pip3 install pyautogui即可安装该库! 常用操作 我们在pyautogui库中常常使用的方法,如下: import pyautogui pyautogui.PAUSE = 1 # 调用在执行动作后暂停的秒数,只能在执行一些pyaut

  • 详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    [m : ] 代表列表中的第m+1项到最后一项 [ : n] 代表列表中的第一项到第n项 [-1] 代表去到最后一项 [:-1]代表除了最后一个都获取到 [::-1]代表逆序取,从后向前取 [2::-1]代表从下标从0到2的三个数,逆序取 [1:]代表从下标为1开始取到最后一个数 例子: import numpy as np a=np.random.rand(5) print(a) [ 0.64061262 0.8451399 0.965673 0.89256687 0.48518743] pr

  • 详解Python中__new__方法的作用

    目录 前言 一.__new__方法简介 1.初始化数据加载+解析类实例 2.初始化数据加载重写new方法+解析类实例 二.单例模式 1.用new方法如何实现单例模式 2.如何控制类仅执行一次初始化方法 三.多例模式 总结 前言 Python中类的构造方法__new__方法有何作用? Python类中有些方法名.属性名的前后都添加__双下画线,这种方法.属性通常属于Python的特殊方法和特殊属性.通过重写这些方法或直接调用这些方法来实现特殊功能.今天来聊聊构造方法__new__实际程序的应用场景

随机推荐