首页 > 编程语言 >python中@classmethod和@staticmethod方法

python中@classmethod和@staticmethod方法

时间:2022-10-14 10:13:31浏览次数:41  
标签:f1 python classmethod staticmethod print 装饰 cls

在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
# hello world

  上述中,说明被classmethod装饰后的方法,通过cls参数,在该方法中,可以调用该类的其他方法。

所以在类中,通过@classmethod装饰的函数,首先在方法中必须传递第一个参数cls, 该函数可以被类直接调用,也可以被对象调用!!!

同时,因为传递了一个cls,所以可以调用类中的其他属性和方法。

 

标签:f1,python,classmethod,staticmethod,print,装饰,cls
From: https://www.cnblogs.com/shaoyishi/p/16790680.html

相关文章

  • python运用Anaconda3设置开机启动项目
    1、安装Anaconda3-5.2.0-Windows-x86_64.exe2、利用Anaconda创建运行环境py38 3、在Anaconda3-5.2.0-Windows-x86_64.exe的安装目录下C:\ProgramData\Anaconda3\Scripts......
  • 盘点一个Python网络爬虫+正则表达式处理案例
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【鑫】问了一个Python网络爬虫的问题,提问截图如下:下面是他的代码:importrequestsimportreurl="https......
  • python中的字符串/列表查找函数小总结
    find()和index()首先是适用情况,'list'objecthasnoattribute'find',list没有find方法,str全有.返回的情况:查找成功都会返回查找字符串的首位的下标(索引).若......
  • 进入python的世界_day14_python基础——算法、三元表达式、生成式、匿名函数
    一、算法1.介绍​ 算法是通过数学模型运算得到某些数据的过程,在python中通过与代码相结合,可以在特定场景下很方便的解决问题2.应用场景​ 很广,大数据推广就是利用算......
  • Python学习路程——Day14
    Python学习路程——Day14算法简介1、什么是算法''' 算法就是解决问题的有效方法,并不是所有的算法都很高效、也不是所有的算法都合格。'''2、算法应用场景''' 推荐......
  • python 编码规范起源:PEP8 编码规范中文版
     PEP:8标题:Python代码的样式指南版:c451868df657最后修改:​​2016-06-0810:43:53-0400(2016年6月8日星期三)​​作者:GuidovanRossum<guidoatpython.org>,BarryWarsaw<b......
  • python re 模块及正则表达式调用认识(1)
           最近用到正则表达式,虽然看了学习了一些,但是不成体系,没有深刻认识,所以来看官方文档学习下,进行一个半汉化的翻译吧,网上查了很多都不是特别全面,要不就不是纯粹......
  • python编码类型转换及字符集探讨
    一直遇到python编码的问题。常常抓取的网页数据信息,邮件收发信息,涉及到文字处理的,都时不时出现编码的问题。终于,觉得有必要认真了解下这个编码过程和出现对应的问题如何解决......
  • 关于python class
    1、class的定义classX(Y)"MakeaclassnamedXthatis-aY."classX(object):def__init__(self,J)"classXhas-a__init__thattakesselfandJpar......
  • python算法简介与各种生成式
    今日内容概要算法简介及二分法三元表达式各种生成式匿名函数重要内置函数常见内置函数今日内容详细算法简介及二分法1.什么是算法 算法就是解决问题的有校......