<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    python之面向對象的特征

    創建自已對象就python非常核心的概念,事實上,python被稱為面向對象語言,本章會介紹如何創建對象。以及面向對象的概念:繼承、封裝、多態。

     

    • 多態: 可對不同類的對象使用同樣的操作。
    • 封裝:對外部世界隱藏對象的工作細節。 
    • 繼承:以普通的類為基礎建立專門的類對象。

     

     

    多態

    面向對象程序設計最有趣的特性是多太,它是是讓大多數人犯暈的特性。所以,先來介紹這個。

    多態意思是“有多種形式”。多態意味著就算不知道變量所引用的對象類是什么,還是能對它進行操作,而它也會根據對象(或類)類型的不同而表現出不同的行為。

     

    從最簡單的開始

      任何不知道對象到底是什么類型,但是又要對對象“做點什么”的時候,都會用到多態。這不僅限于方法----很多內建運算符和函數都有多態的性質,考慮下面這個例子:

    >>> 1 + 2 3 >>> 'fish' + 'license' 'fishlicense'

     

    這里的加運算符對于數字(本例中為整數)和字符串(以及其他類型的序列)都能起作用。假設有個叫做add的函數,它可以將兩個對象相加。那么可以直接將其定義成上面的形式,對于很多類型的參數都可以用,如下:

    復制代碼
    >>> def add(x,y):     return x+y  >>> add(1,2) 3 >>> add('hello.','world') 'hello.world'
    復制代碼

    看起來有點傻,但是關鍵在于參數可以是任何支持加法的對象。

     

    如果需要編寫打印對象長度消息的函數,則只需對象具有長度(len函數可用)即可。

    復制代碼
    >>> def length_message(x):     print"The length of " , repr(x),"is",len(x)       >>> length_message('chongshi') The length of  'chongshi' is 8 >>> length_message([1,2,3]) The length of  [1, 2, 3] is 3
    復制代碼

    len函數用于計算長度,repr用于放置函數的內容;repr函數是多態特性的代表之一---可以對任何東西使用。 

    很多函數和運算符都是多態的,你寫的絕大多數程序可能都是,即便你并非有意這樣。

     

     

    封裝

     

    封裝是對全局作用域中其它區域隱藏多余信息的原則。

    封裝聽起來有些像多態,因為他們都是 抽象的原則---他們都會幫助處理程序組件而不用過多關心多余細節,就像函數做的一樣。

    但是封裝并不等同于多態。多態的可以讓用戶對于不知道是什么類(或對象類型)的對象進行方法調用,而封裝是可以不用關心對象是如何構建的而直接進行使用。

    創建一個有對象(通過像調用函數一樣調用類)后,將變量c綁定到該對象上。可以使用setName 和 getName 方法(假設已經有)

    >>> c = closedObject() >>> c.setName('sir lancelot') >>> c.getName() ‘sir lancelot’

     

     

    繼承

    我們不想把同一段代碼寫好幾,之前使用的函數避免了這種情況。但現在又有個更微妙的問題。如果已經有了一個類,又想建立一個非常類似的類,只是添加幾個方法。

    比如有動物類,我們又想在動物類的基礎上建立鳥類、魚類,哺乳動物類。

     

    上面這些特性會根據后面的學習來深入的理解。

     ================================

     

     

    創建自己的類

     

    終于可以創建自己的類了,先來看一個簡單的類:

    復制代碼
    _metaclass_ = type #確定新式類  class Person:     def setName(self,name):         self.name = name      def getName(self):         return self,name      def greet(self):         print "Hello, world! I'm %s" %self.name
    復制代碼

    注意:新式類的語法中,需要在模塊或者腳本開始的地方放置賦值語句_metaclass_ = type 。

     

    創建了一個Person的類,這個類包含了三個方法定義,只是那個self看起有點奇怪,它是對于對象自身的引用。

    讓我們創建實例看看:

    >>> huhu = Person() >>> huhu.setName('hu zhiheng') >>> huhu.greet() Hello, world! I'm hu zhiheng

    應該能說明self的用處了,在調用huhusetName 和 greet 函數時,huhu自動將自己作為第一個參數傳入函數中----因此形象地命名為self。每個人可能都會有自己的叫法,但是因為它總是對象自身,所以習慣上總是叫做self 

     

    和之前一樣,特性也可以在外部訪問:

    >>> huhu.name 'hu zhiheng' >>> huhu.name = 'yoda' >>> huhu.greet() Hello, world! I'm yoda

     

     

     

    特性、函數和方法

     

    self 參數事實上正是方法和函數的區別。方法將它們的第一個參數綁定到所屬的實例上,因此這個參數可以不必提供。所以可以將特性綁定到一個普通函數上,這樣就不會有特殊的self參數了:

    復制代碼
    >>> class Class:     def method(self):         print 'I have a self!'           >>> def function():     print "I don't"       >>> instance = Class() >>> instance.method() I have a self! >>> instance.method = function >>> instance.method() I don't
    復制代碼

     

    self參數并不取決于調用方法的方式,目前使用的是實例調用方法,可以隨意使用引用同一個方法的其他變量:

    復制代碼
    >>> class Bird:     song =  'Squaawk!'     def sing(self):         print self.song           >>> bird = Bird() >>> bird.sing() Squaawk! >>> birdsong = bird.sing >>> birdsong() Squaawk!
    復制代碼

     

     

     

    指定超類

     

    子類可以擴展超類的定義。將其他類名寫在class語句后的圓括號內可以指定超類:

    復制代碼
    class Filter:     def init(self):         self.blocked = []     def filter(self , sequence):         return [x for x in sequence if x not in self.blocked]  class SPAMFilter(Filter):  #SPAMFilter是Filter的子類     def init(self):        #重寫Filter類中的init方法         self.blocked = ['SPAM']
    復制代碼

    Filter 是個用于過濾序列的通用類,事實上它不能過濾任何東西:

    >>> f = Filter() >>> f.init() >>> f.filter([1,2,3]) [1, 2, 3]

    Filter 類的用戶在于它可以用作其他類的基類(超類,“java中叫父類”),比如SPAMFilter類,可以將序列中的“SPAM”過濾出來。

    >>> s = SPAMFilter() >>> s.init() >>> s.filter(['SPAM','SPAMD','SPAM','HELLO','WORLD','SPAM']) ['SPAMD', 'HELLO', 'WORLD']

     

     

     

    調查繼承

     

    如果想要查看一個類是否是另一個的子類。可以使用內建的issubclass函數:

    >>> issubclass(SPAMFilter, Filter) True >>> issubclass(Filter,SPAMFilter) False

     

    posted on 2014-02-12 19:06 順其自然EVO 閱讀(206) 評論(0)  編輯  收藏 所屬分類: python

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲理论在线观看| 性色av免费观看| 国产成人综合亚洲AV第一页| 亚洲国产成人精品无码区二本| 岛国av无码免费无禁网站| 亚洲冬月枫中文字幕在线看| h片在线免费观看| 激情内射亚洲一区二区三区爱妻| 最近2019年免费中文字幕高清| 日本久久久久亚洲中字幕| 91精品国产免费网站| 亚洲天堂一区在线| 亚洲免费观看在线视频| 亚洲三级在线视频| 四虎成人免费大片在线| 毛片亚洲AV无码精品国产午夜| 免费成人午夜视频| 中国黄色免费网站| 亚洲视频精品在线| 精品久久久久成人码免费动漫| 亚洲综合无码一区二区痴汉| 成人免费视频国产| 一边摸一边桶一边脱免费视频| 精品国产_亚洲人成在线高清| 久久精品视频免费播放| 亚洲日韩乱码中文无码蜜桃 | 又粗又大又黑又长的免费视频| 亚洲三级在线播放| 免费日韩在线视频| 中文无码成人免费视频在线观看| 亚洲自偷精品视频自拍| 免费无码又爽又高潮视频 | 中文字幕亚洲色图| 在线播放高清国语自产拍免费 | 国产精品免费久久久久电影网| 亚洲AV永久无码精品一百度影院| 无码区日韩特区永久免费系列 | 国产午夜精品久久久久免费视| 亚洲性无码av在线| 亚洲成av人片在线观看天堂无码| 在线看片免费人成视频福利|