Python中的多态与虚函数

   C++中的虚函数与多态,是很多C++面向对象程序设计的一个基础,在Python中,是否也存在多态和虚函数,答案是有的。看下面的这个例子

from abc import ABCMeta, abstractmethod


class Base():
    __metaclass__ = ABCMeta

    def __init__(self):
        pass

    @abstractmethod
    def get(self):
        print "Base.get()"
        pass


class Derive1(Base):
    def get(self):
        print "Derive1.get()"


class Derive2(Base):
    def get(self):
        print "Derive2.get()"


if __name__ == '__main__':
    b = Base()
    b.get()

运行的时候,提示:

    b = Base()
TypeError: Can't instantiate abstract class Base with abstract methods get


如果分别构建两个子类的对象,则

if __name__ == '__main__':
    b = Derive1()
    c = Derive2()
    b.get()
    c.get()

运行结果:

Derive1.get()
Derive2.get()


从上面的例子可以看出,代码已经具备C++中多态和虚函数的特点了


那么,Python是如何做到这点的?


1.abc module

在代码中,首先

from abc import ABCMeta, abstractmethod
python 文档对于abc是这么定义的


This module provides the infrastructure for defining abstract base classes (ABCs) in Python


2. 声明 metaclass

__metaclass__ = ABCMeta

Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class

关于metaclass的定义,可以参见http://jianpx.iteye.com/blog/908121


3.申明函数为虚函数

@abstractmethod

A decorator indicating abstract methods.

Using this decorator requires that the class’s metaclass is ABCMeta or is derived from it. A class that has a metaclass derived from ABCMeta cannot be instantiated unless all of its abstract methods and properties are overridden. The abstract methods can be called using any of the normal ‘super’ call mechanisms.









评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值