• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【python】Python实例方法、静态方法和类方法详解(包含区别和用法)

一、类方法的分类

类方法也可以进行更细致的划分,具体可分为

  • 类方法:@classmethod 修饰的方法为类方法, 定义的方法,需要一个默认的形式参数cls
  • 实例方法:不用任何修饰的方法为实例方法。定义的方法,需要一个默认的形式参数self
  • 静态方法:采用 @staticmethod 修饰的方法为静态方法

 

二、类方法的分类

2.1、实例方法

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用,例如:

class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    # 下面定义了一个say实例方法
    def say(self):
        print("正在调用 say() 实例方法")


调用实例方法
用类的实例对象访问类成员的方式称为绑定方法,而用类名调用类成员的方式称为非绑定方法。

 //【绑定调用】,类实例.方法名
  1. clang = CLanguage()
  2. clang.say()

  //【非绑定调用】, 类名.方法名(实例对象)

  1. #类名调用实例方法,需手动给 self 参数传值
  2. clang = CLanguage()
  3. CLanguage.say(clang)

2.2、类方法

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。

和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。

和实例方法最大的不同在于,类方法需要使用@classmethod修饰符进行修饰,例如:

注意,如果没有 @classmethod,则 Python 解释器会将 info() 方法认定为实例方法,而不是类方法。

class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    #下面定义了一个类方法
    @classmethod
    def info(cls):
        print("正在调用类方法",cls)


//类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)
  1. #使用类名直接调用类方法
  2. CLanguage.info()
  3. #使用类对象调用类方法
  4. clang = CLanguage()
  5. clang.info()

 

2.3、类静态方法

静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。
静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

静态方法需要使用@staticmethod修饰,例如:

class CLanguage:
    @staticmethod
    def info(name,add):
        print(name,add)


在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,但在一些特殊的场景中(例如工厂模式中),使用类方法和静态方法也是很不错的选择。
静态方法的调用,既可以使用类名,也可以使用类对象,例如:

  1. #使用类名直接调用静态方法
  2. CLanguage.info("C语言中文网","http://c.biancheng.net")
  3. #使用类对象调用静态方法
  4. clang = CLanguage()
  5. clang.info("Python教程","http://c.biancheng.net/python")

 

posted on 2024-07-31 12:03  无信不立  阅读(53)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3