A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁柳 中级黑马   /  2018-11-8 16:54  /  1170 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁柳 于 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.调用通名方法

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马