Python实例方法、静态方法和类方法详解(包含区别和用法)
和类属性一样,类方法也可以更详细地划分,可以分为类方法、实例方法和静态方法。
不同于类属性的分类。对于初学者来说,区分这三种方法很简单,即带有@修饰的方法是类方法;带有@修饰的方法是静态方法;方法,无需对实例方法进行任何修改。
其中@和@是函数装饰器,后续章节会详细介绍。
下面将详细介绍这三种方法。
类实例方法 通常方法,类中定义的方法默认为实例方法。在前面的章节中,我们定义了多个实例方法。不仅如此,类构造器在理论上也是一个实例方法,只是比较特殊。
例如,实例方法用在以下类中:
class CLanguage: #类构造方法,也属于实例方法 def __init__(self): self.name = "C语言中文网" self.add = "http://c.biancheng.net" # 下面定义了一个say实例方法 def say(self): print("正在调用 say() 实例方法")
实例方法最大的特点是它至少包含一个self参数,用于绑定调用该方法的实例对象(绑定会自动完成)。实例方法通常直接与类对象一起调用,例如:
clang = CLanguage() clang.say()
运行结果:
调用 say() 实例方法
当然,也支持使用类名调用实例方法,但是这种方法需要手动将值传递给self参数。例如:
#类名调用实例方法,需手动给 self 参数传值 clang = CLanguage() CLanguage.say(clang)
结果是:
调用 say() 实例方法
有关直接使用类名调用实例方法的更多信息方法,请阅读“从类调用实例方法”部分。
类方法类方法与实例方法类似,它也至少包含一个参数,只是在类方法中通常命名为cls,并且会自动将类本身绑定到cls参数(注意绑定不是一个类对象)。也就是说,我们在调用类方法的时候不需要显式地为cls参数传递参数。
和self一样,不指定cls参数的命名(可以随意命名),只是程序员的一种习惯。
与实例方法最大的区别是类方法需要用@修饰符进行修改,例如:
class CLanguage: #类构造方法,也属于实例方法 def __init__(self): self.name = "C语言中文网" self.add = "http://c.biancheng.net" #下面定义了一个类方法 @classmethod def info(cls): print("正在调用类方法",cls)
请注意,如果没有@,解释器会将 fly() 方法视为实例方法,而不是类方法。
类方法推荐直接使用类名调用,当然也可以使用实例对象调用(不推荐)。比如在上面的类的基础上,在类外添加如下代码:
#使用类名直接调用类方法 CLanguage.info() #使用类对象调用类方法 clang = CLanguage() clang.info()
结果是:
调用类方法
调用类方法
类静态方法 静态方法其实就是我们学过的功能。与函数唯一的区别是静态方法定义在类的空间(类命名空间),而函数定义在程序所在的空间(全局命名空间)。
静态方法没有像 self 和 cls 这样的特殊参数,因此解释器不会对其包含的参数进行任何类或对象绑定。因此,任何类属性和类方法都不能从类的静态方法中调用。
静态方法需要用@修改,例如:
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语言中文网站
教程
在实际编程中,几乎从不使用类方法和静态方法,因为我们可以用函数代替它们来实现想要的功能,但是在一些特殊的场景下(比如工厂模式),使用类方法和静态方法是也是不错的选择。