天天看點

面向對象

##############面向對象程式設計################

一 程式設計範式

面向對象程式設計——Object Oriented Programming,簡稱 OOP,把對象作為程式的基本單元,一個對象包含了資料和操作資料的函數。

面向過程把函數繼續切分為子函數,來降低系統的複雜度。

二 基礎概念

類: 在 Python 中,所有資料類型都可以視為對象,當然也可以自定義對象。自定義的對象資料類型就是面向對象中的類(Class)。

OOP首選思考的不是程式的執行流程,而是某個資料類型應該被視為一個對象,這個對象擁有的屬性(Property)。

方法: 給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。

三 類

class Animals(object):   ###定義類,object頂級類

    def __init__(self,name,age):  ###構造函數,後面跟你要傳遞的參數

        self.name = name

        self.age = age

    def eating(self):    ####方法,與函數唯一的差別是self

        print "%s is eating ....." %self.name

    def drink(self):             

        print "%s is drinking ....." %self.name

fentiao = Animals('fentiao',5)  ######執行個體化

fentiao.eating()

fentiao.drink()

Class 是一種抽象概念,比如我們定義的 Class——Animals,是指動物這個概念;

執行個體()則是一個個具體的  Animals;

面向對象的抽象程度又比函數要高,因為一個 Class 既包含資料,又包含操作資料的方法。

object表示該類是從哪個類繼承下來的。通常,如果沒有合适的繼承類,就使用 object 類,這是所有類最終都會繼承的類。

建立執行個體的方式:fentiao = Animals('fentiao',5)

可以自由地給執行個體變量綁定屬性,fentiao.name fentaio.age

可定義一個特殊的 __init__ 方法,在建立執行個體的時候,就把name , age等屬性綁上去

__init__ 方法的第一個參數永遠是 self ,表示建立的執行個體本身;

在類中定義的函數隻有一點不同,就是第一個參數永遠是執行個體變量self ,并且調用時,不用傳遞該參數。

四 資料封裝

資料和邏輯被“封裝”起來了,調用很容易,但卻不用知道内部實作的細節。

封裝的另一個好處是可以給類增加新的方法;

class Animals(object):              # 定義類

    cn = 'china'                    #類變量

    def __init__(self,name,age,gender):    #構造函數,後面跟你要傳遞的參數,執行個體過程中執行的操作

        self.name = name            # self就是執行個體化的變量名,self.name是執行個體化屬性,靜态屬性

        self.__gender = gender      #以雙下劃線開頭的變量名,稱為私有變量或屬性

    def eating(self):               #方法,與函數唯一的差別是self,動态屬性

        print '%s is eating.....'%self.name

    def drink(self):

        print '%s is drinking......' %self.name

    def get_gender(self):

        self.__hello()

        return self.__gender

    def __hello(self):          # 私有方法

        print 'hello.....'

class Cat(Animals):

    pass

fentiao = Animals("fentiao",5,'male')

fentiao.__hello()

五 通路限制

在 Python 中,執行個體的變量名如果以 __ 開頭,就變成了一個私有變量(private);

雙下劃線開頭的執行個體變量是不是一定不能從外部通路呢?NO

class Animals(object):

    def __init__(self,name,age,gender):

        self.__gender = gender

    def eating(self):

        return "%s is %s ....." %(self.name,self.__gender)

fentiao = Animals('fentiao',5,'male')

print fentiao._Animals__gender

fentiao.__gender = 'female'

print fentiao.__gender

<a href="https://s5.51cto.com/wyfs02/M02/9B/EF/wKioL1lo5MHxkaVZAAGfbulX_VQ653.png-wh_500x0-wm_3-wmp_4-s_1643857147.png" target="_blank"></a>

六 繼承和多态

class Animal(object):

def run(self):

print 'Animal is running...'

class Dog(Animal):

pass

class Cat(Animal):

對于 Dog 來說,Animal 就是它的父類,對于 Animal 來說,Dog 就是它

的子類;

繼承最大的好處是子類獲得了父類的全部功能。

繼承的另一個好處:多态。子類的覆寫了父類的方法。

(1)

    def __init__(self,name,age,):

        print "%s is eating fish ....." %self.name

class Dog(Animals):

        print "%s is eating gutou ....." %self.name

a1=Animals('animals1',2)

a1.eating()

a1.drink()

c1=Cat('cat1',5)

c1.drink()

c1.eating()

d1=Dog('dog1',4)

d1.eating()

d1.drink()

(2)

    def __init__(self,name,age,color):

        Animals.__init__(self,name,age)

        self.color = color

        print "%s is eating fish ....." %(self.name)

    def info(self):

        print """

                          cat info

    name:%s

    age:%d

    color:%s

    """%(self.name,self.age,self.color)

c1 = Cat('cat1',5,'black')

c1.info()

<a href="https://s4.51cto.com/wyfs02/M00/9B/F0/wKiom1lo5MKTr2upAAFYqduqbZ4700.png-wh_500x0-wm_3-wmp_4-s_4260342672.png" target="_blank"></a>

七 擷取對象資訊

使用 type();

使用 isinstance();

使用 dir()

#####加了結束程序

    def __del__(self):         # 資料庫斷開

        print "that's all,game over"

class Realtion(object):

    def make_friend(self,obj):

        print "%s is %s friend" %(self.name,obj.name)

class Cat(Animals,Realtion):

class Dog(Animals,Realtion):

        print "%s is eating gutou ....." %(self.name)

c1 = Cat('tangmu',5,'black')

d2 = Dog('jieke',3)

c1.make_friend(d2)

<a href="https://s5.51cto.com/wyfs02/M00/9B/EF/wKioL1lo5MPQtxIhAAEdbAx0FKA933.png-wh_500x0-wm_3-wmp_4-s_3111708766.png" target="_blank"></a>

本文轉自 如何何如  51CTO部落格,原文連結:http://blog.51cto.com/12778805/1947736,如需轉載請自行聯系原作者

繼續閱讀