免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8913 | 回复: 10
打印 上一主题 下一主题

Python多态和C++多态,哪个更有利? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 17:27 |只看该作者 |倒序浏览
看到这样一段代码:

class aa:
    def __init__(self):
        pass
    def get(self):
        d=5
        return d
class bb(aa):
    def __init__(self):
        aa.__init__(self)
    def get(self):
        d=3
        return d
class dd(aa):
    def __init__(self):
        aa.__init__(self)
    def get(self):
        d=4
        return d


def getNum(cc):
    print cc.get()

first=aa()
second=bb()
third=dd()

getNum(first)
getNum(second)
getNum(third)


输出
5
3
4


被称着是Python的多态,它和C++的多态有点不一样。

在C++中实现多态的要点是:
基类中定义虚函数,派生类中重载虚函数。然后用基类指针指向派生类的对象,调用派生类中重载后的函数。

到底利弊如何,想听听大家的意见?

论坛徽章:
0
2 [报告]
发表于 2009-06-01 23:33 |只看该作者
这问题老大了
python和java一样,都是子类可以覆盖父类的方法
以子类为父类之定制的角度看,python和java的做法更正确些
因为定制包括修改已有的和开发没有的

C++里,貌似父类的一些方法,子类是没办法在保持类型隐藏的情况下覆盖的
这种情况下子类只能扩展不能修改父类的功能
这种多态限制太大,俺认为不够广泛
~~~~~~~~~~~~~~~~
个人见解  全不充数

论坛徽章:
0
3 [报告]
发表于 2009-06-02 08:01 |只看该作者
不好讲,别太过多关注语法的东西。
各自都有特色的部分,谈不上利弊。如果都一样的话,没必要存在这么多语言了

论坛徽章:
0
4 [报告]
发表于 2009-06-02 12:30 |只看该作者
楼上2位说得有理,我个人觉得Python在多态方面更好操作一点。原因在于Python是动态类型的语言,而C++是静态类型。

例如C++中

class A
{
    virtual void dosomething()=0;
}

class B:public A
{
    void dosomething(){};
}


在程序中

A* aPtr;
aPtr=new B();
aPtr->dosomething();


就调用了B中的dosomething()函数。

但是在Python中,动态类型就可以了,不需要用基类类型的指针。如

class A:
    def __init__(self):
        pass
    def get(self):
        d=5
        return d
class B(A):
    def __init__(self):
        A.__init__(self)
    def get(self):
        d=3
        return d
class C(A):
    def __init__(self):
        A.__init__(self)
    def get(self):
        d=4
        return d


在程序中

a=A() # 相当于C++中的基类指针
b=B()
c=C()

# 可以这样实现多态
a=b # a指向派生对象b
a.get() #调用B的函数

a=c # a指向派生对象c
a.get() # 调用C的函数


可以看出动态类型语言Python实现多态更方便。

[ 本帖最后由 refeihc 于 2009-6-2 12:34 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-06-02 14:22 |只看该作者

回复 #4 refeihc 的帖子

还是要根据具体项目来选择语言,动态语言看起来却是方便快捷

论坛徽章:
0
6 [报告]
发表于 2009-06-03 13:47 |只看该作者
从我对多态的理解来看,python的不能叫做多态。本身就是另外一个对象吗

论坛徽章:
0
7 [报告]
发表于 2009-06-03 17:10 |只看该作者

回复 #6 fufeiwxy 的帖子

同意

论坛徽章:
0
8 [报告]
发表于 2009-06-11 11:34 |只看该作者
没看出如此“多态”有什么意义,明明就是另外一个对象。

这样的继承,能调用父类的方法么?

论坛徽章:
0
9 [报告]
发表于 2009-06-11 11:42 |只看该作者
写了个例子:

class Father :
    def __init__(self):
        pass

    def drink(self):
        print 'drink bear...';

    def eat(self):
        print 'eat bread...';

class Son(Father):
    def __init__(self):
        Father.__init__(self);

    def drink(self):
        print 'drink milk...'


if __name__ == "__main__":
    father = Father();
    father.drink();
    father.eat();

    son = Son();
    son.drink();
    son.eat();



输出结果:

  1. drink bear...
  2. eat bread...
  3. drink milk...
  4. eat bread...
复制代码



不知道为什么,Father 不写 __init__方法,实例化子类的时候会报错。

[ 本帖最后由 child_bbs 于 2009-6-11 11:43 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-06-11 11:47 |只看该作者
重新写了一个不显示调用__init__的:

class Father :
    def drink(self):
        print 'drink bear...';

    def eat(self):
        print 'eat bread...';

class Son(Father):
    def drink(self):
        print 'drink milk...'


if __name__ == "__main__":
    father = Father();
    father.drink();
    father.eat();

    son = Son();
    son.drink();
    son.eat();



看来虽然 Python 会给class默认 __init__ 方法,但是显示调用的时候还是必须手写才行啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP