Python类调用实例方法

在 Python 默认情况下,类体中定义的方法是实例方法,通过对象调用实例方法。
但是要提醒大家的是,Python 类在很大程度上是命名空间。当程序在类别中定义变量和方法时,它们与上述定义变量和定义函数没有太大区别。比较以下代码:
#foo函数定义了全球空间
deffoo():
print("全局空间的foo方法")
#bar变量的全局空间
bar=20
classBird:
#定义Bird空间的foo函数
deffoo():
print("foo方法Bird空间")
#bar变量定义Bird空间
bar=200
#调用全球空间的函数和变量
foo()
print(bar)
#调用Bird空间的函数和变量
Bird.foo()
print(Bird.bar)上面的代码在整体空间和 Bird 类(Bird 空间)分别定义 foo() 函数和 bar 从定义它们的代码来看,变量几乎没有区别,只是在 Bird 当类中定义它们时,需要缩进。
下一步是调用程序 Bird 空间内的 bar 变量和 foo() 函数(方法)只需添加 Bird. 前缀就够了,说明完全可以通过 Bird 类来调用 foo() 函数(方法)。这是类调用实例方法的证明。
现在问题来了。如果使用类调用实例法,则该方法的第一个参数(self)如何自动绑定?例如,以下程序:
classUser: defwalk(self): print(self,'正在慢慢走') #通过类调用实例法 User.walk()
操作上述代码,程序将报告以下错误:
TypeError:walk()missing1requiredpositionalargument:'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 传入方法调用者。这种调用方法被称为“未绑定方法”。
