Python学习06.07:Python实例方法、静态方法和类方法详解(包含区别和用法)

笑着哭i 提交于 2020-02-25 19:16:29

和类变量一样,类方法也可以进行更细致的划分,具体可分为类函数、实例函数和静态函数

和类变量的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的函数为类函数;采用 @staticmethod 修饰的函数为静态函数;不用任何修改的方法为实例函数(@classmethod 和 @staticmethod 都是函数装饰器)

接下来就给大家详细的介绍这 3 种类方法。

Python类实例函数

通常情况下,在类中定义的函数默认都是实例函数。前面章节中,我们已经定义了不只一个函数方法。不仅如此,类的构造方法理论上也属于实例函数,只不过它比较特殊。

比如,下面的类中就用到了实例函数:

class CLanguage:
    # 类构造函数,也属于实例函数
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"

    # 下面定义了一个say实例函数
    def say(self):
        print("正在调用say()实例函数")

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

clang = CLanguage()
clang.say()

运行结果:

正在调用say()实例函数

当然,Python 也支持使用类名调用实例函数,但此方式需要手动给 self 参数传值。例如:

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

运行结果为:

正在调用say()实例函数

有关使用类名直接调用实例函数的更多介绍,可阅读《Python类调用实例方法》一节。

Python类函数

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

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

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

class CLanguage:
    # 类构造函数,也属于实例函数
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"

    # 下面定义了一个类函数
    @classmethod
    def info(cls):
        print("正在调用类函数", cls)

注意,如果没有 @classmethod,则 Python 解释器会将 fly() 方法认定为实例函数,而不是类函数。类函数推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。例如,在上面 CLanguage 类的基础上,在该类外部添加如下代码:

# 使用类名直接调用类函数
CLanguage.info()
# 使用类对象调用类函数
clang = CLanguage()
clang.info()

# 运行结果为:
正在调用类函数
正在调用类函数


Python类静态函数

静态函数,其实就是我们学过的函数,和函数唯一的区别是,静态函数定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。

静态函数没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态函数中无法调用任何类变量和类函数

静态函数需要使用@staticmethod修饰,例如:

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

静态函数的调用,既可以使用类名,也可以使用类对象,例如:

# 使用类名直接调用静态函数
CLanguage.info("C语言中文网","http://c.biancheng.net")

# 使用类对象调用静态函数
clang = CLanguage()
clang.info("Python教程","http://c.biancheng.net/python")

# 运行结果为:

C语言中文网 http://c.biancheng.net
Python教程 http://c.biancheng.net/python

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!