要了解多态就得先了解强类型语言和弱类型语言,如果只是学过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
字符串
123
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!