黑马程序员技术交流社区

标题: 【广州python】python中的多态 [打印本页]

作者: 丁柳    时间: 2018-11-8 16:54
标题: 【广州python】python中的多态
本帖最后由 丁柳 于 2018-11-8 16:59 编辑

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态 ,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
鸭子类型:虽然我想要一只"鸭子",但是你给了我一只鸟。 但是只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子。
Python的多态,就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确。
[Python] 纯文本查看 复制代码
class MiniOS(object):   
"""MiniOS 操作系统类 """   
    def __init__(self, name):        
        self.name = name        
        self.apps = []  # 安装的应用程序名称列表   
    def __str__(self):        
        return "%s 安装的软件列表为 %s" % (self.name, str(self.apps))   
    def install_app(self, app):        
        # 判断是否已经安装了软件        
        if app.name in self.apps:            
            print("已经安装了 %s,无需再次安装" % app.name)        
        else:            
            app.install()
            self.apps.append(app.name)
class App(object):
    def __init__(self, name, version, desc):
        self.name = name
        self.version = version
        self.desc = desc
    def __str__(self):
       return "%s 的当前版本是 %s - %s" % (self.name, self.version, self.desc)
   def install(self):
        print("将 %s [%s] 的执行程序复制到程序目录..." % (self.name, self.version))
class PyCharm(App):
    pass
class Chrome(App):
   def install(self):
       print("正在解压缩安装程序...")
        super().install()
linux = MiniOS("Linux")
print(linux)
pycharm = PyCharm("PyCharm", "1.0", "python 开发的 IDE 环境")
chrome = Chrome("Chrome", "2.0", "谷歌浏览器")
linux.install_app(pycharm)
linux.install_app(chrome)
linux.install_app(chrome)
print(linux)

运行结果:
Linux 安装的软件列表为 []
将 PyCharm [1.0] 的执行程序复制到程序目录...
正在解压缩安装程序...
将 Chrome [2.0] 的执行程序复制到程序目录...
已经安装了 Chrome,无需再次安装
Linux 安装的软件列表为 ['PyCharm', 'Chrome']

通俗点理解:真正调用install函数时给其传递的不一定是app类的实例对象,有可能是其子类的实例对象, 这种情况就是所谓的多态。

发生多态的三个条件:
1.发生继承
2.子类重写父类同名方法
3.调用通名方法






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2