相关文章推荐
长情的电池  ·  flutter - Accessing ...·  1 年前    · 
奋斗的毛豆  ·  python ...·  2 年前    · 
闷骚的蛋挞  ·  RDS ...·  2 年前    · 
函数和lambda表达式
8 Python类和对象
8.1 Python面向对象
8.2 Python class:定义类
8.3 Python __init__()类构造方法
8.4 Python类对象的创建和使用
8.5 Python self
8.6 Python类属性和实例属性
8.7 Python实例方法、静态方法和类方法
8.8 Python类调用实例方法
8.9 为什么说Python类是独立的命名空间?
8.10 什么是描述符,Python描述符详解
8.11 Python property()
8.12 Python @property装饰器
8.13 Python封装
8.14 探究Python封装的底层实现原理
8.15 Python继承机制
8.16 在子类中,Python到底是如何找到父类的属性和方法的?(深度揭秘)
8.17 Python父类方法重写
8.18 如何使用Python继承机制提高开发效率?
8.19 Python super()
8.20 切记,super()只能在新式类中使用!
8.21 使用super(),这些“坑”千万别踩!
8.22 Python __slots__
8.23 Python type()动态创建类
8.24 Python MetaClass元类
8.25 Python底层是如何实现MetaClass元类的?
8.26 什么是多态,Python多态及用法详解
8.27 Python枚举类
8.28 [Python项目实战]利用面向对象思想实现搜索引擎
类特殊成员(属性和方法) Python异常处理机制 Python模块和包 Python文件操作(I/O)
和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法 实例方法 静态方法。
和类属性的分类不同,对于初学者来说,区分这 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() 运行结果为: 正在调用类方法 <class '__main__.CLanguage'>
正在调用类方法 <class '__main__.CLanguage'>

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

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

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

微信扫码关注公众号