一文带你了解python中的多态
发布时间:2025-03-04 22:16:50

众所周知,Python是一种弱型语言,其最明显的特征是在使用变量时不需要指定具体的数据类型。这会导致同一变量的情况
不同类别的对象可能会被先后赋值,例如:
classCLanguage:
defsay(self):
print("CLanguage实例对象赋值")
classCPython:
defsay(self):
print("CPython类实例对象赋值")
a=CLanguage()
a.say()
a=CPython()
a.say()运行结果如下:
CLanguage实例对象赋值 CPython类实例对象赋值
可以看到,a 可以先后赋值 CLanguage 类和 CPython 类的对象,但这不是多态的。类的多态特性应满足以下要求 2 前提条件:继承:多态必须发生在子类和父类之间;重写:子类重写父类的方法。
以下程序是上述代码的重写:
classCLanguage:
defsay(self):
print("调用Clanguagesay方法")
classCPython(CLanguage):
defsay(self):
print("调用CPythonsay方法")
classCLinux(CLanguage):
defsay(self):
print("调用CLinuxsay方法")
a=CLanguage()
a.say()
a=CPython()
a.say()
a=CLinux()
a.say()执行结果
调用Clanguage类的say方法 调用CPythonsay方法 调用CLinuxsay方法
可以看到,CPython 和 CLinux 都继承自 CLanguage 而且每个人都重写了父类 say() 方法。从操作结果可以看出,相同的变量 a 执行同一个 say() 因为方法 a 因此,实际上表示不同类别的实例对象 a.say() 调用的不是同一类 say() 方法,这就是多态。
然而,仅仅学习这一点,读者是无法欣赏的 Python 类使用多态特性的精髓。事实上,Python 在多态化的基础上,衍生出更灵活的编程机制。
继续重写上述程序:
classWhoSay:
defsay(self,who):
who.say()
classCLanguage:
defsay(self):
print("调用Clanguagesay方法")
classCPython(CLanguage):
defsay(self):
print("调用CPythonsay方法")
classCLinux(CLanguage):
defsay(self):
print("调用CLinuxsay方法")
a=WhoSay()
#调用CLanguagesay()方法
a.say(CLanguage())
#调用CPythonsay()方法
a.say(CPython())
#调用CLinuxsay()方法
a.say(CLinux())程序执行结果如下:
调用Clanguagesay方法 调用CPythonsay方法 调用CLinuxsay方法
在此程序中,通过给予 WhoSay 类中的 say() 添加一个函数 who 参数内部使用介入的参数 who 调用 say() 方法。这意味着当调用时
WhoSay 类中的 say() 当我们传递方法时 who 参数是哪个类的实例对象,它将调用该类中的实例对象 say() 方法。
