1. 程式人生 > >python基礎-面向對象編程

python基礎-面向對象編程

動態 但是 技術 初始 語法 調用 .cn 多種實現 eat

面向對象編程

OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,並且可以大大提高程序開發效率 ,另外,基於面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。

面向對象的幾個核心特性如下

Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法

Object 對象
一個對象即是一個類的實例化後實例,一個類必須經過實例化後方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同

Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含著類的數據和方法

Inheritance 繼承
一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承

Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定

對於編程語言的初學者來講,OOP不是一個很容易理解的編程方式,大家雖然都按老師講的都知道OOP的三大特性是繼承、封裝、多態,並且大家也都知道了如何定義類、方法等面向對象的常用語法,但是一到真正寫程序的時候,還是很多人喜歡用函數式編程來寫代碼,特別是初學者,很容易陷入一個窘境就是“我知道面向對象,我也會寫類,但我依然沒發現在使用了面向對象後,對我們的程序開發效率或其它方面帶來什麽好處,因為我使用函數編程就可以減少重復代碼並做到程序可擴展了,為啥子還用面向對象?”。 對於此,我個人覺得原因應該還是因為你沒有充分了解到面向對象能帶來的好處,今天我就寫一篇關於面向對象的入門文章,希望能幫大家更好的理解和使用面向對象編程。 無論用什麽形式來編程,我們都要明確記住以下原則:
  1. 寫重復代碼是非常不好的低級行為
  2. 你寫的代碼需要經常變更
開發正規的程序跟那種寫個運行一次就扔了的小腳本一個很大不同就是,你的代碼總是需要不斷的更改,不是修改bug就是添加新功能等,所以為了日後方便程序的修改及擴展,你寫的代碼一定要遵循易讀、易改的原則(專業數據叫可讀性好、易擴展)。 如果你把一段同樣的代碼復制、粘貼到了程序的多個地方以實現在程序的各個地方調用 這個功能,那日後你再對這個功能進行修改時,就需要把程序裏多個地方都改一遍,這種寫程序的方式是有問題的,因為如果你不小心漏掉了一個地方沒改,那可能會導致整個程序的運行都 出問題。 因此我們知道 在開發中一定要努力避免寫重復的代碼,否則就相當於給自己再挖坑。 還好,函數的出現就能幫我們輕松的解決重復代碼的問題,對於需要重復調用的功能,只需要把它寫成一個函數,然後在程序的各個地方直接調用這個函數名就好了,並且當需要修改這個功能時,只需改函數代碼,然後整個程序就都更新了。 其實OOP編程的主要作用也是使你的代碼修改和擴展變的更容易,那麽小白要問了,既然函數都能實現這個需求了,還要OOP幹毛線用呢? 呵呵,說這話就像,古時候,人們打仗殺人都用刀,後來出來了槍,它的主要功能跟刀一樣,也是殺人,然後小白就問,既然刀能殺人了,那還要槍幹毛線,哈哈,顯而易見,因為槍能更好更快更容易的殺人。函數編程與OOP的主要區別就是OOP可以使程序更加容易擴展和易更改。 類的語法 如下代碼中的解釋
 1 class Dog(object):
 2     def __init__(self,name,dog_type):
 3         """構造函數或者構造方法,也可以叫做初始化方法"""
 4         self.Nmae = name    #相當於d.Name = name
 5         self.Dog_type = dog_type
 6 
 7     def sayhi(self):    #類的方法
 8         print(You are a %s dog,your name is %s%(self.Dog_type,self.Nmae))
 9     def eat(self):      #類的方法
10         pass
11 d = Dog(xiaowang,京巴)    #相當於Dog(d,‘xiaowang‘,‘京巴‘),self:實例化後產生的對象叫做實例,這裏self指當前類的實例,也就是d。
12 """‘xiaowang,京巴 這兩個參數是給類的構造函數穿的參數‘"""
13 d.sayhi()   #相當於d.sayhi(d)
14 
15 輸出:
16 You are a 京巴 dog,your name is xiaowang

上面d = Dog(‘xiaowang‘,‘京巴‘),d就是類Dog實例化的一個實例,,print(Dog),print(d),輸出如下:

<class __main__.Dog>    # 即使不實例化,這個Dog類本身也是已經存在內存裏的
<__main__.Dog object at 0x0000000000DEA080>  #d就是Dog實例化後的對象,也存在內存裏面

技術分享

示例:

技術分享
 1 class Role(object):
 2     def __init__(self,name,weapon,life_value = 100,money = 15000):
 3         self.name = name
 4         self.weapon = weapon
 5         self.life_value = life_value
 6         self.money = money
 7 
 8     def shot(self):
 9         print(%s is shooting%self.name)
10     def got_shot(self):
11         print("ah...,I got shot...")
12     def buy_gun(self,gun_name):
13         print(%s bought %s%(self.name,gun_name))
14         self.weapon = gun_name  #替換原有的武器
15 
16 d1 = Role(cui,ak47)
17 d2 = Role(wang,B51)
18 d1.buy_gun(b21)
19 print(d1.weapon)
20 
21 輸出:
22 cui bought b21
23 b21
View Code

私有屬性跟公有屬性

私有屬性只能在類內部調用,定義的時候,self.__name = name,前面兩個下劃線。

技術分享
class Role(object):
    def __init__(self,name,weapon,life_value = 100,money = 15000):
        self.name = name
        self.weapon = weapon
        self.life_value = life_value
        self.Money = money
        self.__high = 175  #定義一個私有屬性

    def shot(self):
        print(%s is shooting%self.name)
        print(self.__high)      #內部可以調用
    def got_shot(self):
        print("ah...,I got shot...")
    def buy_gun(self,gun_name):
        print(%s bought %s%(self.name,gun_name))
        self.weapon = gun_name  #替換原有的武器

d1 = Role(cui,ak47)
d2 = Role(wang,B51)
d1.shot()
print(d1.__high)    #調用報錯

輸出:
Traceback (most recent call last):
cui is shooting
  File "D:/script/P_script/python_cq/temp.py", line 25, in <module>
    print(d1.__high)
175
AttributeError: Role object has no attribute __high
View Code

但是如果一定要從外部調用類的私有屬性,可以這樣

print(d1._Role__high)

如果要返回私有屬性的值怎麽辦呢?

技術分享
class Role(object):
    def __init__(self,name,weapon,life_value = 100,money = 15000):
        self.name = name
        self.weapon = weapon
        self.life_value = life_value
        self.Money = money
        self.__high = 175  #定義一個私有屬性

    def shot(self):
        print(%s is shooting%self.name)
        print(self.__high)      #內部可以調用
    def got_shot(self):
        print("ah...,I got shot...")
    def buy_gun(self,gun_name):
        print(%s bought %s%(self.name,gun_name))
        self.weapon = gun_name  #替換原有的武器
    def high(self):     #提供了一個外部訪問私有屬性的只讀接口
        return self.__high

d1 = Role(cui,ak47)
d2 = Role(wang,B51)
d1.shot()
print(d1._Role__high)

print(d1.high())

輸出:

cui is shooting
175
175
175
View Code

公有屬性

  

python基礎-面向對象編程