python掃盲之五-面向對象編程

python掃盲之五-面向對象編程

面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作為程序的基本單元,一個對象包含了數據和操作數據的函數。

是不是看起來不太容易理解?簡單來說,把一個程序想象成一臺車。造一輛車需要車輪,發動機,外殼等等東西,抽象一下,程序中一段程序可以反覆用的可以包裹成函數,我們不用關心函數里面的處理邏輯,只要返回的結果是我們想要的就行了。好返回來,面向對象編程,就是先把車輪,發動機做好了 放在那裡,然後需要的時候拿過來。用程序來說就是,編程一個對象,包裹在class裡,用的時候 實例化一下這個對象。


還是比較複雜對吧,咱們看個小例子

class abc(object): def __init__(self, name): self.name = name def print_score(self): print '%s' % (self.name)

上面這個類 功能就是輸出你傳進去的參數

#首先要實例化類hello = abc(name='weixiansen')hello.print_score() #沒毛病

其實使用起來和函數還是非常類似的,只是概念有些抽象。不過這只是個開始而已。

下面我們說說函數不行但是類行的功能。

訪問限制

還是上面的例子,初始化類的時候,我們傳入name的值,同時實例化後變成self.name ,那麼這個self.name其實是可以被類外部直接訪問的,例如

class abc(object): def __init__(self, name): self.name = name def print_score(self): print '%s' % (self.name)hello = abc(name='test')print hello.name #看到沒,直接調用就能看見了

但現實情況中,我們大多數時候是不希望讓人通過這種探測獲取到類裡面的一些數據,進而分析出裡面的處理邏輯的。所以我們需要把一些敏感變量,或def進行限制訪問,方法也很簡單,就是在前面加上__(兩個下劃線)。看例子

class abc(object): def __init__(self, name): self.__name = name def print_score(self): print '%s' % (self.__name)hello = abc(name='weixiansen')print hello.__name>>Traceback (most recent call last): File "E:/PycharmProjects/untitled8/a.py", line 13, in  print hello.__nameAttributeError: 'abc' object has no attribute '__name'#獲取就報錯了#但如果通過正常的調用訪問呢?class abc(object): def __init__(self, name): self.__name = name def print_score(self): print '%s' % (self.__name)hello = abc(name='weixiansen')hello.print_score()>>weixiansen#沒毛病!

同樣內部的函數也可以通過這種方式進行訪問限制,例子

class abc(object): def __init__(self, name): self.__name = name def __print_score(self): print '%s' % (self.__name)hello = abc(name='test')hello.__print_score()>>Traceback (most recent call last): File "E:/PycharmProjects/untitled8/a.py", line 13, in  hello.__print_score()AttributeError: 'abc' object has no attribute '__print_score'#這種函數只能在類的內部進行調用

類的繼承

這種大招絕對是函數式編程無法比擬的。所謂類的繼承,就是父親和兒子的關係(或者父親,兒子,孫子。。。)。父親(父類)定義的功能,兒子(子類)可以直接使用。或者重新定義父類的功能。看下面的例子:

class abc(object): def __init__(self,): pass def print_score(self): print 'father'class Def(abc): def print2(self): print 'son'zz = Def()zz.print_score()zz.print2()>>fatherson

上面這個例子裡面 子類Def 並沒有設置print_score方法吧,但是依然可以用,就是調用的父類的方法。當然兒子繼承了父親的遺產後,也可以自行支配嘛。重寫父類的方法。例子

class abc(object): def __init__(self,): pass def print_score(self): print 'father'class Def(abc): def print_score(self): print 'son1' def print2(self): print 'son2'zz = Def()zz.print_score()zz.print2()>>son1son2#看這個例子就是父類的方法被子類重寫了。。後浪推前浪啊!


分享到:


相關文章: