Python面向对象 | 多态

typhoonpython 2019-12-31

、多态

多态指的是一类事物有多种形态

python:a 可以接受任意数据类型,对象 默认支持多态。

def func(a):
    pass

动物有多种形态:人,狗,猪

import abc
class Animal(metaclass=abc.ABCMeta):         #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass
 
class People(Animal):                 #动物的形态之一:人
    def talk(self):
        print(‘say hello‘)

class Dog(Animal):                     #动物的形态之二:狗
    def talk(self):
        print(‘say wangwang‘)

class Pig(Animal):                     #动物的形态之三:猪
    def talk(self):
        print(‘say aoao‘)

多态性

什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)

多态性是指在不考虑实例类型的情况下使用实例

class Payment:
    def pay(self):pass

class QQpay(Payment):
    def pay(self, money):
        print(‘使用qq支付了%s元‘%money)

class Wechatpay(Payment):
    def pay(self, money):
        print(‘使用微信支付了%s元‘%money)

def pay(pay_obj,money):                 # 统一支付方法
    ‘‘‘
    :param pay_obj: 实例化对象
    :param money: 金钱
    :return: 使用xx支付了xx元
    ‘‘‘
    pay_obj.pay(money)                  # 执行实例化对象的类方法pay

qq = QQpay()
we = Wechatpay()

pay(qq, 100)
pay(we, 200)

‘‘‘
执行输出:
使用qq支付了100元
使用微信支付了200元
‘‘‘

通过执行pay函数,传入不同的参数返回不同的结果,这就是多态

一种接口,多种实现

上面的例子是面向过程的函数加面向对象,实现的。整形效果不好,把函数放到父类里面

class Payment:
    @staticmethod
    def pay(pay_obj,money): # 静态方法.需要通过类名+方法名来调用这个方法
        pay_obj.pay(money)

class QQpay(Payment):
    def pay(self, money):
        print(‘使用qq支付了%s元‘%money)

class Wechatpay(Payment):
    def pay(self, money):
        print(‘使用微信支付了%s元‘%money)

qq = QQpay()
we = Wechatpay()

Payment.pay(qq, 100)
Payment.pay(we, 200) 

‘‘‘
执行输出:
使用qq支付了100元
使用微信支付了200元
‘‘‘

无论是python的2.*还是3.* : 天生自带多态效果

多态通过继承实现

在python中不需要刻意实现多态,因为python本身自带多态效果

相关推荐