亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: Python多態(tài)和C++多態(tài),哪個(gè)更有利? [打印本頁(yè)]

作者: refeihc    時(shí)間: 2009-06-01 17:27
標(biāo)題: Python多態(tài)和C++多態(tài),哪個(gè)更有利?
看到這樣一段代碼:

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的多態(tài),它和C++的多態(tài)有點(diǎn)不一樣。

在C++中實(shí)現(xiàn)多態(tài)的要點(diǎn)是:
基類中定義虛函數(shù),派生類中重載虛函數(shù)。然后用基類指針指向派生類的對(duì)象,調(diào)用派生類中重載后的函數(shù)。

到底利弊如何,想聽(tīng)聽(tīng)大家的意見(jiàn)?
作者: 大于連    時(shí)間: 2009-06-01 23:33
這問(wèn)題老大了
python和java一樣,都是子類可以覆蓋父類的方法
以子類為父類之定制的角度看,python和java的做法更正確些
因?yàn)槎ㄖ瓢ㄐ薷囊延械暮烷_(kāi)發(fā)沒(méi)有的

C++里,貌似父類的一些方法,子類是沒(méi)辦法在保持類型隱藏的情況下覆蓋的
這種情況下子類只能擴(kuò)展不能修改父類的功能
這種多態(tài)限制太大,俺認(rèn)為不夠廣泛
~~~~~~~~~~~~~~~~
個(gè)人見(jiàn)解  全不充數(shù)
作者: xiaoyu9805119    時(shí)間: 2009-06-02 08:01
不好講,別太過(guò)多關(guān)注語(yǔ)法的東西。
各自都有特色的部分,談不上利弊。如果都一樣的話,沒(méi)必要存在這么多語(yǔ)言了
作者: refeihc    時(shí)間: 2009-06-02 12:30
樓上2位說(shuō)得有理,我個(gè)人覺(jué)得Python在多態(tài)方面更好操作一點(diǎn)。原因在于Python是動(dòng)態(tài)類型的語(yǔ)言,而C++是靜態(tài)類型。

例如C++中

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

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


在程序中

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


就調(diào)用了B中的dosomething()函數(shù)。

但是在Python中,動(dòng)態(tài)類型就可以了,不需要用基類類型的指針。如

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() # 相當(dāng)于C++中的基類指針
b=B()
c=C()

# 可以這樣實(shí)現(xiàn)多態(tài)
a=b # a指向派生對(duì)象b
a.get() #調(diào)用B的函數(shù)

a=c # a指向派生對(duì)象c
a.get() # 調(diào)用C的函數(shù)


可以看出動(dòng)態(tài)類型語(yǔ)言Python實(shí)現(xiàn)多態(tài)更方便。

[ 本帖最后由 refeihc 于 2009-6-2 12:34 編輯 ]
作者: xiaoyu9805119    時(shí)間: 2009-06-02 14:22
標(biāo)題: 回復(fù) #4 refeihc 的帖子
還是要根據(jù)具體項(xiàng)目來(lái)選擇語(yǔ)言,動(dòng)態(tài)語(yǔ)言看起來(lái)卻是方便快捷
作者: fufeiwxy    時(shí)間: 2009-06-03 13:47
從我對(duì)多態(tài)的理解來(lái)看,python的不能叫做多態(tài)。本身就是另外一個(gè)對(duì)象嗎
作者: DQP    時(shí)間: 2009-06-03 17:10
標(biāo)題: 回復(fù) #6 fufeiwxy 的帖子
同意
作者: child_bbs    時(shí)間: 2009-06-11 11:34
沒(méi)看出如此“多態(tài)”有什么意義,明明就是另外一個(gè)對(duì)象。

這樣的繼承,能調(diào)用父類的方法么?
作者: child_bbs    時(shí)間: 2009-06-11 11:42
寫了個(gè)例子:

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();



輸出結(jié)果:

  1. drink bear...
  2. eat bread...
  3. drink milk...
  4. eat bread...
復(fù)制代碼



不知道為什么,F(xiàn)ather 不寫 __init__方法,實(shí)例化子類的時(shí)候會(huì)報(bào)錯(cuò)。

[ 本帖最后由 child_bbs 于 2009-6-11 11:43 編輯 ]
作者: child_bbs    時(shí)間: 2009-06-11 11:47
重新寫了一個(gè)不顯示調(diào)用__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();



看來(lái)雖然 Python 會(huì)給class默認(rèn) __init__ 方法,但是顯示調(diào)用的時(shí)候還是必須手寫才行啊。
作者: ttvast    時(shí)間: 2009-06-17 17:13
python 會(huì)給class默認(rèn)__init__方法么?
class需要默認(rèn)__init__方法么?
不要想當(dāng)然。

只相信你看到的,不要想太多了。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2