函数和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 类,分别是类方法、实例方法和静态方法,其中实例方法用的是最多的。我们知道,实例方法的调用方式其实有 2 种,既可以采用类对象调用,也可以直接通过类名调用。
通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样: class CLanguage: def info(self): print("我正在学 Python ") #通过类名直接调用实例方法 CLanguage.info() 运行上面代码,程序会报出如下错误:
Traceback (most recent call last):
File "D:\python3.6\demo.py", line 5, in <module>
CLanguage.info()
TypeError: info() missing 1 required positional argument: 'self'

其中,最后一行报错信息提示我们,调用 info() 类方式时缺少给 self 参数传参。这意味着,和使用类对象调用实例方法不同,通过类名直接调用实例方法时,Python 并不会自动给 self 参数传值。 读者想想也应该明白,self 参数需要的是方法的实际调用者(是类对象),而这里只提供了类名,当然无法自动传值。

因此,如果想通过类名直接调用实例方法,就必须手动为 self 参数传值。例如修改上面的代码为: class CLanguage: def info(self): print("我正在学 Python") clang = CLanguage() #通过类名直接调用实例方法 CLanguage.info(clang) 再次运行程序,结果为: 我正在学 Python

可以看到,通过手动将 clang 这个类对象传给了 self 参数,使得程序得以正确执行。实际上,这里调用实例方法的形式完全是等价于 clang.info()。
值得一提的是,上面的报错信息只是让我们手动为 self 参数传值,但并没有规定必须传一个该类的对象,其实完全可以任意传入一个参数,例如: class CLanguage: def info(self): print(self,"正在学 Python") #通过类名直接调用实例方法 CLanguage.info("zhangsan") 运行结果为: zhangsan 正在学 Python

可以看到,"zhangsan" 这个字符串传给了 info() 方法的 self 参数。显然,无论是 info() 方法中使用 self 参数调用其它类方法,还是使用 self 参数定义新的实例变量,胡乱的给 self 参数传参都将会导致程序运行崩溃。
总的来说,Python 中允许使用类名直接调用实例方法,但必须手动为该方法的第一个 self 参数传递参数,这种调用方法的方式被称为“非绑定方法”。 用类的实例对象访问类成员的方式称为 绑定方法 ,而用类名调用类成员的方式称为 非绑定方法

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

微信扫码关注公众号