Python类体中定义的方法默认为实例方法,通过对象调用实例方法。
但需要提醒的是,Python 的类在很大程度上是一个命名空间。当程序在类体中定义变量和方法时,与上面描述的变量和函数的定义没有太大区别。比较以下代码:
# 定义全局空间的foo函数
def foo ():
print("全局空间的foo方法")
# 全局空间的bar变量
bar = 20
class Bird:
# 定义Bird空间的foo函数
def foo():
print("Bird空间的foo方法")
# 定义Bird空间的bar变量
bar = 200
# 调用全局空间的函数和变量
foo()
print(bar)
# 调用Bird空间的函数和变量
Bird.foo()
print(Bird.bar)
上面的代码分别定义了全局空间和Bird类(Bird空间)中的foo()函数和bar变量。从定义它们的代码来看,几乎没有区别,只是在 Bird 类中定义它们时需要缩进。
接下来,当程序在Bird空间中调用bar变量和foo()函数(方法)时,只需要添加Bird即可。前缀,表示可以完全通过Bird类调用foo()函数(方法)。这证明该类调用了实例方法。
现在的问题是,如果使用类调用实例方法,如何自动绑定方法的第一个参数(self)?例如下面的程序:
class User:
def walk (self):
print(self, '正在慢慢地走')
# 通过类调用实例方法
User.walk()
运行上面代码,程序会报出如下错误:
TypeError: walk() missing 1 required positional argument:'self'
请看程序最后一行代码,对walk()方法的调用缺少传入的self参数,所以程序失败。这意味着当使用类调用实例方法时,Python 不会自动为第一个参数绑定调用者。实际上并没有自动绑定,所以实例方法的调用者是类本身,而不是对象。
如果程序还想用类调用实例方法,就必须手动传入方法第一个参数的参数值。例如,将上面的粗体代码更改为如下所示:
u = User()
# 显式为方法的第一个参数绑定参数值
User.walk(u)
这段代码将参数值显式绑定到 walk() 方法的第一个参数,这与执行 u.walk() 完全相同。
实际上,通过User类调用walk()实例方法时,Python只需要手动绑定第一个参数的参数值,不需要绑定User对象,所以也可以使用如下代码调用:
# 显式为方法的第一个参数绑定fkit字符串参数值
User.walk('fkit')
如果如上绑定,'fkit' 字符串将被传递给 walk() 方法的第一个参数 self。因此,运行上述代码,你将看到以下输出:
fkit 正在慢慢地走
总结
Python类可以调用实例方法,但是当使用类调用实例方法时,Python不会自动为方法的第一个参数self绑定参数值;程序必须显式传入第一个参数 self 的方法调用者。这种调用方式称为“未绑定方法”。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何输出换行符10/14
- ♥ python处理列表的部分元素10/13
- ♥ 如果不在python中如何使用?10/23
- ♥ Python中的匿名函数是什么11/08
- ♥ 如何在python中判断它是否为空10/05
- ♥ 如何使用 Python Flashtext 模块?12/17
内容反馈