先说句题外话,之前对简书编辑器不是很清楚,所以代码段添加一直都有点问题往后的文章对代码段添加不会再有问题了:
设置调制为markdown编辑器,然后fn加~即可;输入```,用这个把代码括起来即可
=======================================================
前面掌握了python的封装还有继承,其实我觉得哈,语法把基础的涉及到的东西学会,然后会用,然后有些比较冷门的可以后面慢慢补充,人不可能什么都上来就会弄,而且也不可能都能记得住,我觉得最起码的是,要知道基本的怎么用即可;
我们现在学学面向对象的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 类的对象,但这并不是多态。类的多态特性,还要满足以下 2 个前提条件:
继承:多态一定是发生在子类和父类之间;
重写:子类重写了父类的方法。
其实说白了,这肯定不是真的意义上的继承,因为这种继承的话,等于是实例化了两次,所以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 = CLanguage()
a.say()
a = CPython()
a.say()
a = CLinux()
a.say()
程序执行结果为:
调用的是 Clanguage 类的say方法
调用的是 CPython 类的say方法
调用的是 CLinux 类的say方法
这其实看起来和上一章的继承一样,子类覆盖了父类的方法,是吧,也诶有多态的概念啊,那怎么办?
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,say的话,传入参数之一是类,我们把不同的类名传进去,就会调用相对应的类名的方法;这就实现了所谓的多态