来源:python中国网 时间:2020-05-12

  要了解多态就得先了解强类型语言和弱类型语言,如果只是学过python可能不好理解,因为没有对比就无从无感受。学过C的话就好理解了如果没有数据类型的概念可以查看编程语言为什么定义数据类型

  强类型定义语言

  强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了,不能被赋值成其他类型。如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

  弱类型定义语言

  数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。

  python就是典型的弱类型语言,对于弱类型的语言来说,变量并没有声明类型,因此同一个变量完全可以在不同的时间引用不同的对象。当同一个变量在调用同一个方法时,完全可能呈现出多种行为(具体呈现出哪种行为由该变量所引用的对象来决定),这就是所谓的多态(Polymorphism)。

  多态在函数中也能体现,给一个函数的参数传递数值就打印数值,传递字符串就打印字符串。
 

# ‐*‐ coding: utf‐8 ‐*‐

def print_info(arg):
    print(arg,type(arg))

print_info("字符串")
print_info(123)
D:installpython3python.exe D:/pyscript/test/test.py
字符串 <class 'str'>
123 <class 'int'>

Process finished with exit code 0



  通过统一函数接口实现多态

# -*- coding: utf-8 -*-


class Dog(object):
    def say(self):
        print("汪汪汪.....")


class Cat(object):
    def say(self):
        print("喵喵喵.....")


def my_say(obj_type):
    """统一调用接口"""
    obj_type.say() # 什么对象调用say()方法


if __name__ == "__main__":
    dog_obj = Dog()
    cat_obj = Cat()
    my_say(dog_obj)
    my_say(cat_obj)

汪汪汪.....
喵喵喵.....

  通过抽象类实现多态(最常用)

  假如你开发一个数据库操作功能,支持多种数据库,你也不确定会连接哪种数据库,可能是Mysql、clickhouse、redis等,假如为每个数据库都写一个类,每个类都通过connect()方法来连接,为了确保每个类都必须实现connect()方法,就可以写一个抽象类。

# -*- coding: utf-8 -*-


class Database:
    def __init__(self, name):
        self.name = name

    def connect(self):
        raise NotImplementedError("子类 must implement abstract method")


class Clickhouse(Database):
    def connect(self):
        return '连接 Clickhouse'


class Redis(Database):
    def connect(self):
        return '连接 Redis!'



if __name__ == "__main__":
    dbs = [Clickhouse('database1'),Redis('database2')]
    for db in dbs:
        print(db.name + ': ' + db.connect())

database1: 连接 Clickhouse
database2: 连接 Redis!