来源:python中国网 时间:2019-06-06

  要了解多态就得先了解强类型定义语言和弱类型定义语言,如果你只学过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 sound(self):
        print("汪汪汪.....")


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


def make_sound(animal_type):
    """统一调用接口"""
    animal_type.sound() # 不管你传进来是什么动物,我都调用sound()方法


dogObj = Dog()
catObj = Cat()
make_sound(dogObj)
make_sound(catObj)
D:installpython3python.exe D:/pyscript/test/test.py
汪汪汪.....
喵喵喵.....

Process finished with exit code 0



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

  假如你开发一个文本编辑器,支持多种文档类型,在用户通过你的编辑器打开文件之前,你也不知道准备要打开的是什么类型的文件,可能是pdf,也可能是word,假如你为每个文件类型都写一个类,每个类都通过show()方法来调用打开对应的文档,为了确保每个类都必须实现show()方法,你可以写一个抽象类。

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

class Document:

    def __init__(self, name):
        self.name = name
        
    def show(self):
        raise NotImplementedError("Subclass must implement abstract method")


class Pdf(Document):
    def show(self):
        return 'Show pdf contents!'


class Word(Document):
    def show(self):
        return 'Show word contents!'


documents = [Pdf('Document1'),
             Pdf('Document2'),
             Word('Document3')]


for document in documents:
    print(document.name + ': ' + document.show())

D:installpython3python.exe D:/pyscript/test/test.py
Document1: Show pdf contents!
Document2: Show pdf contents!
Document3: Show word contents!

Process finished with exit code 0