ITPub博客

首页 > 数据库 > 数据库开发技术 > python面向对象编程篇(4):静态方法和类方法的区分

python面向对象编程篇(4):静态方法和类方法的区分

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-12 17:59:38 0 删除 编辑

本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。

个人其他博客地址:

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

分析不同

上一篇的关于面向对象编程初识篇里有讲到类中的类方法和静态方法。但是都可以使用类来调用的,那有什么不同的呐?

  • 静态方法:

    静态方法由类来调用,没有默认参数。在方法定义加上@staticmethod的装饰器,且去除self,就成为静态方法。

    静态方法属于类,和实例无关。

    类似类变量,建议只使用类名.静态方法的调用方式,虽然也可以使用实例名.静态方法方式调用)


    静态方法是类中的函数,不需要实例。类本身就可以调用。

  • 类方法:

    类方法和静态方法一样由类调用,但是是采用@classmethod装饰,且需至少传入一个cls(代指类本身,类似self)参数。执类方法行时自动将调用该方法的类赋值给cls。

    类似类变量,建议只使用类名.类方法的调用方式,虽然也可以使用实例名.类方法方式调用)


    类方法是将类本身作为对象进行操作的方法。类本身就可以调用。

  • 实例方法:

    实例对象可以调用的函数,函数。通过self来传递实例的属性和方法(不过也可以传类的属性和方法)


    需要类的实例的对象来调用

从上面的描述可以得知两个方法的共性是:

  • 都是由类对象来调用
  • 也都可以使用关联的对象来调用(但是这个调用可能的到的不是自己的想要的结果)

他们的区别就是装饰方法不同:

  • 类方法,依赖类@classmethod中的cls参数
  • 静态方法,依赖类@staticmethod的装饰器,但是不需要任何参数

代码分析

# -*- coding:utf-8 -*-
class Ape():
    pass

    live = '生命值1111111'

    def __init__(self, name):
        # 定义局部变量name属性
        self.name = name  # 此猿猴的名字

    def eat(self):
        print("实例方法-调用实例变量", self.name)
        print("实例方法-调用类变量", self.live)

    @classmethod
    def eat_classmethod(cls):
        print("类方法====>可以调用类变量", cls.live)


    @staticmethod
    def eat_staticmethod():
        print("静态方法,无法调用我们的类变量(因为没有相关的引用)",live)


Ape.eat_classmethod()
Ape.eat_staticmethod()

从代码上看,我们的类方法,依赖于我们的cls的对象,而eat_staticmethod中调用live会报错:

如此说来,其实我们的可以简单区别开他们的使用的场景:

  • 实例方法,是适用于如果函数内部需要调用我们的属性或类变量之类的。
  • 类方法,是适用于如果函数内部需要依赖于我们的cls本身的一些对象的调用的时候进行使用。
  • 静态函数,无关类的任何属性和方法,通常不会去调用类本身的一些方法和属性,也无法去调用。所以类的静态函数,纯粹的就是一个独立函数的封装,只不过是它把这个函数放到一个类里面去管理。

以上是个人对Python的实例方法,类方法和静态方法之间的区别和作用的简要阐述。

End

纯属个人实践中相关经验阐述总结,如有纰漏,还希望大佬们多多提点!小钟同学 | 文  【原创】| QQ:308711822


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111708