成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[零基礎(chǔ)學(xué)python]編寫類之三子類

dadong / 3122人閱讀

摘要:運(yùn)行繼承的父類運(yùn)行結(jié)果這回運(yùn)行結(jié)果有了變化,本來是運(yùn)行類,但是繼承了,并且在初始化的構(gòu)造函數(shù)中,引入的構(gòu)造函數(shù),所以,就運(yùn)行的結(jié)果相應(yīng)結(jié)果了。

關(guān)于類,看官想必已經(jīng)有了感覺,看下面的代碼,請(qǐng)仔細(xì)閱讀,并看看是否能夠發(fā)現(xiàn)點(diǎn)什么問題呢?

#!/usr/bin/env python
#coding:utf-8

class Person:
    def __init__(self, name, lang, email):
        self.name = name
        self.lang = lang
        self.email = email

    def author(self):
        return self.name

class Programmer:
    def __init__(self, name, lang, email, system, website):
        self.name = name
        self.lang = lang
        self.email = email
        self.system = system
        self.website = website

    def pythoner(self):
        pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
        return pythoner_list

if __name__=="__main__":
    writer = Person("qiwsir","Chinese","qiwsir@gmail.com")
    python = Programmer("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")
    print "My name is:%s"%writer.author()
    print "I write program by:%s"%python.pythoner()[1]

上面這段代碼,運(yùn)行起來沒有什么問題,但是,仔細(xì)看,發(fā)現(xiàn)有兩個(gè)類,一個(gè)名字叫做Person,另外一個(gè)叫做Programmer,這還不是問題所在,問題所在是這兩個(gè)類的構(gòu)造函數(shù)中,存在這相同的地方:self.name=name,self.lang=lang,self.email=email,這對(duì)于追求代碼質(zhì)量的程序員,一般是不允許的。最好不要有重復(fù)代碼或者冗余代碼。可是,在兩個(gè)類中都要有這些參數(shù),應(yīng)該怎么辦呢?

子類、父類和繼承

看下面的代碼,里面有兩個(gè)類A,B。這段程序能夠正確運(yùn)行,每個(gè)類的功能是僅僅打印指定的內(nèi)容。

#!/usr/bin/env python
#coding:utf-8

class A:
    def __init__(self):
        print "aaa"

class B:
    def __init__(self):
        print "bbb"

if __name__=="__main__":
    a = A()
    b = B()

#運(yùn)行結(jié)果
aaa
bbb

上面的兩個(gè)類彼此之間沒有所謂的父子關(guān)系?,F(xiàn)在稍加改變,將類B改寫,注意觀察與上面的差異。

#!/usr/bin/env python
#coding:utf-8

class A:
    def __init__(self):
        print "aaa"

class B(A):         #這里和上面程序不同。B繼承了A
    def __init__(self):
        print "bbb"

if __name__=="__main__":
    a = A()
    b = B()

#運(yùn)行結(jié)果
aaa
bbb

這段程序中,類B跟前面的那段有一點(diǎn)不同,class B(A):,這樣寫就表明了B相對(duì)A的關(guān)系:B是A的子類,B從A繼承A的所有東西(子承父業(yè))。

但是,看官發(fā)現(xiàn)了沒有,運(yùn)行結(jié)果一樣。是的,那是以為在B中盡管繼承了A,但是沒有調(diào)用任何A的東西,就好比兒子從老爸那里繼承了財(cái)富,但是兒子一個(gè)子也沒動(dòng),外界看到的和沒有繼承一樣。

#!/usr/bin/env python
#coding:utf-8

class A:
    def __init__(self):
        print "aaa"

class B(A):
    def __init__(self):
        #print "bbb"
        A.__init__(self)    #運(yùn)行繼承的父類

if __name__=="__main__":
    a = A()
    b = B()

#運(yùn)行結(jié)果
aaa
aaa

這回運(yùn)行結(jié)果有了變化,本來b=B()是運(yùn)行類B,但是B繼承了A,并且在初始化的構(gòu)造函數(shù)中,引入A的構(gòu)造函數(shù),所以,就運(yùn)行A的結(jié)果相應(yīng)結(jié)果了。

下面把最開頭的那端程序用子類繼承的方式重寫,可以是這樣的:

#!/usr/bin/env python
#coding:utf-8

class Person:
    def __init__(self, name, lang, email):
        self.name = name
        self.lang = lang
        self.email = email

    def author(self):
        return self.name
"""
class Programmer:
    def __init__(self, name, lang, email, system, website):
        self.name = name
        self.lang = lang
        self.email = email
        self.system = system
        self.website = website

    def pythoner(self):
        pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
        return pythoner_list
"""

class Programmer(Person):       #繼承父類Person
    def __init__(self, name, lang, email, system, website):
        Person.__init__(self,name,lang,email)   #將Person.__init__()的功能繼承到這里
        #self.name = name                       #這三句是Person中已經(jīng)搞定的,就不用重復(fù)
        #self.lang = lang                       #通過繼承已經(jīng)實(shí)現(xiàn)了這三句的功能
        #self.email = email
        self.system = system                    #子類中不同于Person父類部分
        self.website = website

    def pythoner(self):
        pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
        return pythoner_list

if __name__=="__main__":
    writer = Person("qiwsir","Chinese","qiwsir@gmail.com")
    python = Programmer("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")
    print "My name is:%s"%writer.author()
    print "I write program by:%s"%python.pythoner()[1]

代碼運(yùn)行結(jié)果與前面一樣。

列位是否理解了子類和父類、繼承的特點(diǎn)。如果你有一個(gè)老爹,是一個(gè)高官或者富豪,那么你就官二代或者富二代了,你就從他們那里繼承了很多財(cái)富,所以生活就不用太勞累了。這就是繼承的作用。在代碼中,也類似,繼承能夠讓寫代碼的少勞累一些。

對(duì)于為什么要用繼承,好友@令狐蟲 大俠給了以非常精彩的解釋:

  

從技術(shù)上說,OOP里,繼承最主要的用途是實(shí)現(xiàn)多 態(tài)。對(duì)于多態(tài)而言,重要的是接口繼承性,屬性和行為是否存在繼承性,這是不一定的。事實(shí)上,大量工程實(shí)踐表明,重度的行為繼承會(huì)導(dǎo)致系統(tǒng)過度復(fù)雜和臃腫, 反而會(huì)降低靈活性。因此現(xiàn)在比較提倡的是基于接口的輕度繼承理念。這種模型里因?yàn)楦割悾ń涌陬悾┩耆珱]有代碼,因此根本談不上什么代碼復(fù)用了。

  

在Python里,因?yàn)榇嬖贒uck Type,接口定義的重要性大大的降低,繼承的作用也進(jìn)一步的被削弱了。

  

另外,從邏輯上說,繼承的目的也不是為了復(fù)用代碼,而是為了理順關(guān)系。

我表示完全贊同上述解釋。不過看官如果不理解,也沒有關(guān)系,上述解釋中的精神,的確需要在編程實(shí)踐中感悟才能領(lǐng)會(huì)到的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37389.html

相關(guān)文章

  • [基礎(chǔ)學(xué)python]編寫類之四再論繼承

    摘要:從運(yùn)行結(jié)果可以看出,當(dāng)子類繼承多個(gè)父類的時(shí)候,對(duì)于構(gòu)造函數(shù),只有第一個(gè)能夠被繼承,第二個(gè)就等掉了。重點(diǎn)看,類繼承了,同時(shí),在構(gòu)造函數(shù)中自己做了規(guī)定,也就是的構(gòu)造函數(shù)是按照的意愿執(zhí)行,不執(zhí)行的內(nèi)容,但是,還有一個(gè)方法,則繼承了這個(gè)方法。 在上一講代碼的基礎(chǔ)上,做進(jìn)一步修改,成為了如下程序,請(qǐng)看官研習(xí)這個(gè)程序: #!/usr/bin/env python #coding:utf-8 c...

    BoYang 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]編寫類之二方法

    摘要:是一個(gè)具體的數(shù)據(jù),通過構(gòu)造函數(shù)中的參數(shù),傳給實(shí)例的屬性,在類中的另外一個(gè)方法的參數(shù)列表中第一個(gè)就是,表示要承接對(duì)象,,就是在類內(nèi)部通過對(duì)象,把它的屬性的數(shù)據(jù)傳導(dǎo)如。 上一講中創(chuàng)建了類,并且重點(diǎn)講述了構(gòu)造函數(shù)以及類實(shí)例,特別是對(duì)那個(gè)self,描述了不少。在講述構(gòu)造函數(shù)的時(shí)候特別提到,init()是一個(gè)函數(shù),只不過在類中有一點(diǎn)特殊的作用罷了,每個(gè)類,首先要運(yùn)行它,它規(guī)定了類的基本結(jié)構(gòu)。 ...

    Dongjie_Liu 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]類的細(xì)節(jié)

    摘要:在對(duì)象接口后包裝其實(shí)現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對(duì)用戶產(chǎn)生的影響。類提供了一個(gè)新的本地作用域,最小化了變量名沖突。類其實(shí)并沒有結(jié)束,不過本講座到此對(duì)類暫告一段。 前面對(duì)類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實(shí)話題遠(yuǎn)遠(yuǎn)沒有結(jié)束,不過對(duì)于初學(xué)者,掌握這些已經(jīng)算是入門,在以后的實(shí)踐中,還需要進(jìn)行體會(huì)和感悟。 這幾天和幾個(gè)朋友以各種途徑討論過OOP的相關(guān)問題,他們是:令狐蟲、Frank、晉劍、小馮...

    Fundebug 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]重回函數(shù)

    摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語句幾點(diǎn)說明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關(guān)系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...

    dmlllll 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<