本帖最后由 丁柳 于 2018-11-8 16:59 编辑
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态 ,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。 鸭子类型:虽然我想要一只"鸭子",但是你给了我一只鸟。 但是只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子。
Python的多态,就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确。 [Python] 纯文本查看 复制代码 [/align][align=left]class MiniOS(object): [/align][align=left]"""MiniOS 操作系统类 """ [/align][align=left] def __init__(self, name): [/align][align=left] self.name = name [/align][align=left] self.apps = [] # 安装的应用程序名称列表 [/align][align=left] def __str__(self): [/align][align=left] return "%s 安装的软件列表为 %s" % (self.name, str(self.apps)) [/align][align=left] def install_app(self, app): [/align][align=left] # 判断是否已经安装了软件 [/align][align=left] if app.name in self.apps: [/align][align=left] print("已经安装了 %s,无需再次安装" % app.name) [/align][align=left] else: [/align][align=left] app.install()[/align][align=left] self.apps.append(app.name)[/align][align=left]class App(object):[/align][align=left] def __init__(self, name, version, desc): [/align][align=left] self.name = name[/align][align=left] self.version = version[/align][align=left] self.desc = desc[/align][align=left] def __str__(self): [/align][align=left] return "%s 的当前版本是 %s - %s" % (self.name, self.version, self.desc) [/align][align=left] def install(self):[/align][align=left] print("将 %s [%s] 的执行程序复制到程序目录..." % (self.name, self.version))[/align][align=left]class PyCharm(App):[/align][align=left] pass[/align][align=left]class Chrome(App): [/align][align=left] def install(self): [/align][align=left] print("正在解压缩安装程序...")[/align][align=left] super().install()[/align][align=left]linux = MiniOS("Linux")[/align][align=left]print(linux)[/align][align=left]pycharm = PyCharm("PyCharm", "1.0", "python 开发的 IDE 环境")[/align][align=left]chrome = Chrome("Chrome", "2.0", "谷歌浏览器")[/align][align=left]linux.install_app(pycharm)[/align][align=left]linux.install_app(chrome)[/align][align=left]linux.install_app(chrome)[/align][align=left]print(linux)
运行结果: Linux 安装的软件列表为 [] 将 PyCharm [1.0] 的执行程序复制到程序目录... 正在解压缩安装程序... 将 Chrome [2.0] 的执行程序复制到程序目录... 已经安装了 Chrome,无需再次安装 Linux 安装的软件列表为 ['PyCharm', 'Chrome']
通俗点理解:真正调用install函数时给其传递的不一定是app类的实例对象,有可能是其子类的实例对象, 这种情况就是所谓的多态。
发生多态的三个条件: 1.发生继承 2.子类重写父类同名方法 3.调用通名方法
|