我们都知道Python是一种弱类型语言,它最明显的特点就是在使用变量的时候,不需要为它们指定具体的数据类型。这导致了相同变量的情况
可能会被先后赋值不同的类对象,例如:
class CLanguage:
def say(self):
print("赋值的是 CLanguage 类的实例对象")
class CPython:
def say(self):
print("赋值的是 CPython 类的实例对象")
a = CLanguage()
a.say()
a = CPython()
a.say()
运行结果为:
赋值的是 CLanguage 类的实例对象
赋值的是 CPython 类的实例对象
可见a可以依次赋值给CLanguage类和CPython类的对象,但这不是多态。一个类的多态特性还必须满足以下两个前提条件: 继承:多态性必须发生在子类和父类之间;重写:子类重写父类的方法。
下面程序是对上面代码的改写:
class CLanguage:
def say(self):
print("调用的是 Clanguage 类的say方法")
class CPython(CLanguage):
def say(self):
print("调用的是 CPython 类的say方法")
class CLinux(CLanguage):
def say(self):
print("调用的是 CLinux 类的say方法")
a = CLanguage()
a.say()
a = CPython()
a.say()
a = CLinux()
a.say()
执行结果
调用的是 Clanguage 类的say方法
调用的是 CPython 类的say方法
调用的是 CLinux 类的say方法
可以看出,CPython和CLinux都是继承自CLanguage类,并且各自重写了父类的say()方法。从运行结果可以看出,当同一个变量a执行同一个say()方法时,由于a实际上代表了不同的类实例对象,所以a.say()并没有调用同一个类中的say()方法,这样是多态性。
然而,仅仅学习到这里,读者还不能体会到在Python类中使用多态特性的本质。事实上,Python在多态性的基础上衍生出一种更加灵活的编程机制。
继续对上面的程序进行改写:
class WhoSay:
def say(self,who):
who.say()
class CLanguage:
def say(self):
print("调用的是 Clanguage 类的say方法")
class CPython(CLanguage):
def say(self):
print("调用的是 CPython 类的say方法")
class CLinux(CLanguage):
def say(self):
print("调用的是 CLinux 类的say方法")
a = WhoSay()
#调用 CLanguage 类的 say() 方法
a.say(CLanguage())
#调用 CPython 类的 say() 方法
a.say(CPython())
#调用 CLinux 类的 say() 方法
a.say(CLinux())
程序执行结果为:
调用的是 Clanguage 类的say方法
调用的是 CPython 类的say方法
调用的是 CLinux 类的say方法
在这个程序中,通过在WhoSay类中的say()函数中添加一个who参数,在内部使用传入的who来调用say()方法。这意味着当调用
在WhoSay类中使用say()方法时,我们将哪个类实例对象传递给who参数,它就会调用该类中的say()方法。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在mac上删除python08/25
- ♥ qt如何调用python10/20
- ♥ 如何使函数在python中不返回结果09/27
- ♥ python中的js是什么10/29
- ♥ python可以做接口编程吗?09/20
- ♥ 如何循环嵌套在python中12/24
内容反馈