python静态方法和类方法的区别实例解析

 更新时间:2025年09月08日 15:12:10   作者:Lumiron  
本文给大家介绍python静态方法和类方法的区别,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

类方法 (Class Method)

1、定义:使用装饰器 @classmethod 修饰。第一个参数必须是 cls,它指向类本身(不是实例),而不是 self。
2、可以通过类名直接调用,也可以通过实例调用(但更推荐用类名调用,以明确意图)。无论通过哪种方式调用,cls 参数都会自动传入为类本身。
3、权限:不能访问或修改特定的实例属性(因为它没有 self),但可以访问和修改类的属性(通过 cls.attr)。
4、用途:
工厂方法 (Factory Method):作为一种替代构造函数的创建实例的方式,可以提供更清晰的语义(例如,根据不同的参数格式创建对象)。
操作类级状态:当方法需要修改或读取所有实例共享的类变量时。
在继承中,cls 会指向调用它的子类,这使得类方法在继承体系中非常有用。
工厂方法代码:

class Pizza:
    def __init__(self, ingredients):
        self.ingredients = ingredients
    def __repr__(self):
        return f'Pizza({self.ingredients})'
    @classmethod
    def margherita(cls):
        # `cls` 在这里是 Pizza 类,我们可以调用它来创建实例
        return cls(['mozzarella', 'tomatoes'])
    @classmethod
    def prosciutto(cls):
        return cls(['mozzarella', 'tomatoes', 'ham'])
# 不需要记住配料,直接使用类提供的工厂方法创建特定口味的披萨
pizza1 = Pizza.margherita() # 通过类调用
pizza2 = Pizza.prosciutto()
print(pizza1) # Pizza(['mozzarella', 'tomatoes'])
print(pizza2) # Pizza(['mozzarella', 'tomatoes', 'ham'])
# 也可以通过实例调用(不推荐,容易让人困惑)
obj = Pizza(['cheese'])
pizza3 = obj.margherita()
print(pizza3) # 同样创建了一个新的 Pizza 对象

静态方法 (Static Method)

1、定义:使用装饰器 @staticmethod 修饰。它没有强制性的第一个参数(既没有 self,也没有 cls)。
2、调用:可以通过类名直接调用,也可以通过实例调用。
3、权限:不能访问 self 或 cls。因此,它既不能修改实例状态,也不能修改类状态。它就像一个定义在类命名空间里的普通函数。
4、用途:
工具函数:当一个函数在逻辑上属于某个类,但又不需要访问类或实例的任何数据时。将它放在类内部,而不是作为模块级的函数,可以更好地组织代码,表明它与该类在功能上是相关的。

命名空间管理:将相关的功能分组到类下面。
工具函数的代码:

class Calculator:
    @staticmethod
    def add(x, y):
        return x + y
    @staticmethod
    def multiply(x, y):
        return x * y
# 不需要创建 Calculator 实例,直接通过类名调用
result1 = Calculator.add(5, 3)
result2 = Calculator.multiply(2, 4)
print(result1) # 8
print(result2) # 8
# 也可以通过实例调用(同样不推荐)
calc_obj = Calculator()
result3 = calc_obj.add(1, 2)
print(result3) # 3

实例方法、类方法和静态方法的区别

特性实例方法类方法 (@classmethod)静态方法 (@staticmethod)
装饰器@classmethod@staticmethod
第一个参数self (实例对象)cls (类对象)无强制参数
访问实例属性是 (通过 self)
访问类属性是 (通过 self.class 或类名)是 (通过 cls)
修改实例状态
修改类状态
主要用途操作或读取实例数据作为工厂方法、操作类级状态工具函数、命名空间组织
调用方式必须通过实例推荐通过类,也可通过实例推荐通过类,也可通过实例

如何选择方法?

1、需要访问或修改实例数据吗?

是 -> 使用 实例方法。

2、不需要访问实例数据,但需要访问或修改类数据(类属性),或者需要作为工厂创建实例吗?

是 -> 使用 类方法。

3、既不需要访问实例数据,也不需要访问类数据吗?

是 -> 使用 静态方法。

到此这篇关于python---静态方法和类方法的文章就介绍到这了,更多相关python静态方法和类方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python全栈之模板渲染详解

    Python全栈之模板渲染详解

    这篇文章主要为大家详细介绍了Python全栈之模板渲染,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 使用python将微信image下.dat文件解密为.png的方法

    使用python将微信image下.dat文件解密为.png的方法

    这篇文章主要介绍了使用python将微信image下.dat文件解密为.png的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Python中使用实现输出哈沙德数的多种方法小结

    Python中使用实现输出哈沙德数的多种方法小结

    哈沙德数(Harshad Number),又称Niven数,是指一个自然数,它可以被它的各位数字之和整除,本文将探讨如何使用多种不同的方法来判断一个数字是否是哈沙德数,感兴趣的可以了解下
    2024-01-01
  • Python验证码识别处理实例

    Python验证码识别处理实例

    这篇文章主要介绍了Python验证码识别处理实例,实现过程讲解很详细,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 基于Python的Jenkins的二次开发操作

    基于Python的Jenkins的二次开发操作

    这篇文章主要介绍了基于Python的Jenkins的二次开发操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 2020最新pycharm汉化安装(python工程狮亲测有效)

    2020最新pycharm汉化安装(python工程狮亲测有效)

    这篇文章主要介绍了2020最新pycharm汉化安装(python工程狮亲测有效),文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python3.4 tkinter,PIL图片转换

    Python3.4 tkinter,PIL图片转换

    我们给大家整理了关于Python3.4 tkinter,PIL图片转换的相关完整代码,大家可以学习测试下。
    2018-06-06
  • Python OpenCV图像指定区域裁剪的实现

    Python OpenCV图像指定区域裁剪的实现

    这篇文章主要介绍了Python OpenCV图像指定区域裁剪的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Django实现从数据库中获取到的数据转换为dict

    Django实现从数据库中获取到的数据转换为dict

    这篇文章主要介绍了Django实现从数据库中获取到的数据转换为dict,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python 类与元类的深度挖掘 II【经验】

    Python 类与元类的深度挖掘 II【经验】

    元类在 Python 中属于比较深层的黑魔法,在一般的日常应用中可能并不常用,但理解其背后的原理对于理解 Python 面向对象编程以及一切皆为对象的理念很有帮助;如果你需要对类进行深度改造,至少要知道从何入手。
    2016-05-05

最新评论