相关文章推荐
不拘小节的吐司  ·  金敏喜,“退出雌竞的美”·  7 月前    · 
眼睛小的小蝌蚪  ·  挽澜镇_百度百科·  1 年前    · 
瘦瘦的棒棒糖  ·  hadoop本地库版本问题_debug ...·  2 年前    · 
踢足球的青椒  ·  Sqlite date issue - ...·  2 年前    · 
聪明的签字笔  ·  关于转化医学-广州中医药大学 ...·  2 年前    · 
Code  ›  Python,你真的会使用 staticmethod 和 classmethod 吗?开发者社区
python 静态方法 静态函数 静态变量
https://cloud.tencent.com/developer/article/1692519
腼腆的八宝粥
2 年前
作者头像
AirPython
0 篇文章

Python,你真的会使用 staticmethod 和 classmethod 吗?

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Python 自动化 > Python,你真的会使用 staticmethod 和 classmethod 吗?

Python,你真的会使用 staticmethod 和 classmethod 吗?

作者头像
AirPython
发布 于 2020-09-04 16:38:55
4.9K 0
发布 于 2020-09-04 16:38:55
举报

1. 场景

前几天,有一个小伙伴过来问我,Python 中的 @staticmethod、@classmethod、self、cls 分别代表什么意思,自己平时光顾着用,不知道具体的含义?

事实上,由于 Python 语言的灵活性,这部分内容在日常编码过程中,很容易被忽略掉

本篇文章将和大家一起聊聊这几个小知识点

2.@staticmethod

装饰器 @staticmethod 修饰的方法称为:静态方法,和普通的函数没有什么区别

下面将聊聊实际项目中几种应用场景

1、要调用一个静态方法,一般使用形式是:「 类名.方法名() 」

class Web(object):
    @staticmethod
    def foo_staticmethod():
        """静态方法"""
if __name__ == '__main__':
    # 直接使用类名+方法名调用
    Web.foo_staticmethod()

当然,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式

# 实例化一个对象
instance = Web()
# 使用实例对象去调用静态方法(不建议)
instance.foo_staticmethod()  

2、针对类中定义的静态变量,可以使用「 类名.变量名 」 的形式去访问

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"
    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        # 引用静态变量
        print(Web.name) 

3、静态方法内部使用其他静态方法、类方法,同样是使用「 类名.方法名() 」去调用

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"
    # 类方法
    @classmethod
    def foo_classmethod_other(cls):
        print('类方法被调用!')
    # 另外一个静态方法
    @staticmethod
    def foo_staticmethod_other():
        print('另外一个静态方法被调用!')
    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        # 调用其他静态方法
        print(Web.foo_staticmethod_other()) 
        # 调用类方法
        print(Web.foo_classmethod_other())

4、静态方法内部调用普通方法,访问实例属性

普通方法和实例属性都必须通过实例对象去引用,不能直接使用类名去访问

class Web(object):
    def __init__(self):
        self.desc = "实例属性,不共享"
    def norm_method(self):
        """普通方法"""
        print('普通方法被调用!')
    @staticmethod
    def foo_staticmethod():
        """静态方法"""
        instance = Web()
        # 获取实例属性
        print(instance.desc)
        # 调用普通方法
        instance.norm_method()

5、子类的使用

在子类中调用父类定义好的静态方法,只需要将类名替换为子类名称即可

class Web(object):
    @staticmethod
    def foo_staticmethod(arg1, arg2):
class Django(Web):
    """子类"""
if __name__ == '__main__':
    # 1、使用类名(父类)去调用静态方法
    Web.foo_staticmethod("Hello", ",AirPython")
    # 2、使用类名(子类)去调用静态方法
    Django.foo_staticmethod("Hello", ",AirPython")

3.@classmethod

装饰器 @classmethod 修饰的方法称为:类方法,在使用的时候,会将类本身作为第一个参数 cls 传递给类方法

# 类方法,第一个参数为cls,代表类本身
@classmethod
def foo_classmethod(cls):

其中,cls 代表外层类本身,可以实例化,也可以直接调用静态方法、类方法、静态变量

下面逐一进行说明

1、要调用一个类方法,一般使用形式是:「 类名.方法名() 」

class Web(object):
    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
if __name__ == '__main__':
    # 使用类名去调用类方法
    Web.foo_classmethod()

和静态方法类似,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式

2、调用静态变量

静态方法内部引用静态变量有两种方式,分别是:

  • 「 类名.变量名 」
  • 「 cls.变量名 」

注意:由于 cls 代表就是外层类本身,所以这两种方式等效

class Web(object):
    # 静态变量(类变量)
    name = "Python_Web"
    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 调用静态变量方式一
        print(cls.name)
        # 调用静态变量方式二
        print(Web.name)

3、类方法内部调用其他类方法、静态方法

在一个类方法内部,可以使用「 类名.类方法名() 」、「 类名.静态方法名() 」的形式去调用方法

class Web(object):
    # 静态方法
    @staticmethod
    def foo_staticmethod():
        print('静态方法被调用!')
    # 其他类方法
    @classmethod
    def foo_classmethod_other(cls):
        print('另外一个类方法被调用!')
    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 调用其他类方法
        cls.foo_classmethod_other()
        # 调用静态方法
        cls.foo_staticmethod()
if __name__ == '__main__':
    Web.foo_classmethod()

4、类方法内部调用普通方法,访问实例属性

需要通过 cls 变量实例化一个类对象,然后通过这个对象去调用普通方法和实例属性

class Web(object):
    def __init__(self):
        self.desc = "实例属性,不共享"
    def norm_method(self):
        """普通方法"""
        print('普通方法被调用!')
    # 类方法,第一个参数为cls,代表类本身
    @classmethod
    def foo_classmethod(cls):
        # 如果要调用实例属性,必须使用cls实例化一个对象,然后再去引用
        print(cls().desc)
 
推荐文章
不拘小节的吐司  ·  金敏喜,“退出雌竞的美”
7 月前
眼睛小的小蝌蚪  ·  挽澜镇_百度百科
1 年前
瘦瘦的棒棒糖  ·  hadoop本地库版本问题_debug org.apache.hadoop.util.nativecodeloader - fa-CSDN博客
2 年前
踢足球的青椒  ·  Sqlite date issue - Database Administrators Stack Exchange
2 年前
聪明的签字笔  ·  关于转化医学-广州中医药大学 国际中医药转化医学研究所
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号