python 面向對象 繼承 派生 組合

具體參考博客:http://www.cnblogs.com/linhaifeng/articles/6182264.html#_label12html

一.面向對象python

面向對象:對象與對象之間的相互交互,不可預測最終的結果ide

  對象是特徵 <變量> 與技能 <函數> 的結合體。函數

  類是一系列對象的共同特徵與技能的結合體。spa

  程序中,先有類再有對象,類是抽象的<模板>,而對象是真實存在的。code

class Teacher(object):       #class 定義類,類的首字母大寫
    school='偶的博愛'             #變量 <數據屬性>
    def __init__(self,name,age):   #初始化,以便對象的各自屬性
        self.name=name
        self.age=age
    def teach(self):                      #函數屬性
        print('is teaching ')
            
p1=Teacher('egon',18)             #對象
View Code

  Tips:__init__方法只能幹初始化的活,能夠加任何可執行的代碼,但不能有返回值。 htm

     __dict__查看名稱空間<名稱空間存放着名字與值的綁定關係>對象

    在python3中類型就是類,好比咱們常說的列表/元組/集合/字典 都是類blog

    建立類的過程,若是不添加父類,則默認基類(object).繼承

 1.1實例化

  實例化產生對象.好比p1=Teacher(),Teacher() 就是實例化,也就是說建立實例是經過類名+()實現的,而p1是實例化對象.

類的做用:

  1.實例化對象

    p1=Teacher()

  2.類的屬性引用:數據屬性與函數屬性

    Teacher.school   #數據屬性

    Teacher.teach  #函數屬性

    Teacher.teach()  #類調用函數屬性的時候,必須傳值

對象的做用:

  1.屬性引用

    p1.school       #數據屬性

    p1.teach()      #函數屬性,對象在引用函數屬性的時候會默認傳值,將對象p1傳值到self中。

  對象修改不了類的屬性,咱們看到的修改其實只是在對象裏面建立了一個名稱空間,若是你再在類裏面建立新的對象2,對象2調用該屬性會以類的屬性爲準。

 

二:繼承與派生

  繼承是類與類之間的關係,一種什麼「是」什麼的關係.子類繼承父類,會擁有父類的全部屬性。

 

class People:
    pass

class Animal:
    pass

class Student(People,Animal): #people稱爲基類或父類
    pass



print(Student.__bases__)
print(People.__bases__)
print(Animal.__bases__)
#在python3中,全部類默認繼承object,
#但凡是繼承了object類的子類,以及該子類的子類,都稱爲新式類(在python3中全部的類都是新式類)
#沒有繼承object類的子類成爲經典類(在python2中,沒有繼承object的類,以及它的子類,都是經典類)
View Code

 

  繼承舉例:

class People:
    def __init__(self, name, age)
        self.name = name
        self.age = age
    def walk(self):
        print('%s is walking' %self.name)


class Teacher(People):     #在括號裏裏面加父類,表示繼承父類
    pass                            #此時Teacher類具有People的全部屬性
View Code

  派生:子類在繼承父類的全部屬性後,自身又具有一些特有的屬性,咱們在__init__()後面爲其添加新的屬性,稱爲派生  

  派生舉例:

class People:
    def __init__(self, name, age)
        self.name = name
        self.age = age
    def walk(self):
        print('%s is walking' %self.name)

class Student(People):          #調用的父類爲People
    def __init__(self, name, age,sex,group):
        People.__init__(self, name, age, sex)  
        self.group=group       #group是學生特有的屬性,即爲派生
    def study(self):
            print('%s is studying' %self.name)
View Code

 

三:組合

   #組合:是一種什麼 「有」 什麼的關係,也是爲了減小重複代碼。  區別於繼承,它並非繼承其全部屬性。而是我應該有什麼屬性,避免重複代碼,我去引用這個組合。

class People:                       #人類
    def __init__(self, name, age, year, mon, day):
        self.name = name
        self.age = age
        self.birth = Date(year, mon, day)   ------>人類並非時間,而只是人有生日這個屬性,全部去引用時間類,目的是爲了減小代碼冗餘。而咱們建立的老師類,學生類,則是繼承,由於老師 學生屬於人類.

    def walk(self):
        print('%s is walking' % self.name)

class Date:                                    #時間類
    def __init__(self,year,mon,day):
        self.year=year
        self.mon=mon
        self.day=day

    def tell_birth(self):
        print('出生於<%s>年 <%s>月 <%s>日' % (self.year,self.mon,self.day))
View Code

 

  Tips:1.  後面接的都是屬性

     2..___bases__    查看其父類,默認爲object類。

      凡是集成了object類的子類,以及該子類的子類,都是新式類<在python3中全部的類都是新式類<默認>>

      沒有object的類的子類都是經典類,(在python2中,沒有繼承object的類,以及它的子類都是經典類)

 

四:接口

  python中壓根沒有interface關鍵詞來定義一個接口,但能夠定義Interface來模仿接口的概念。

父類要限制:

 

  #1:子類必需要有父類的方法
  #2:子類實現的方法必須跟父類的方法的名字同樣
class Interface:#定義接口Interface類來模仿接口的概念,python中壓根就沒有interface關鍵字來定義一個接口。
    def read(self): #定接口函數read
        pass

    def write(self): #定義接口函數write
        pass


class Txt(Interface): #文本,具體實現read和write
    def read(self):
        print('文本數據的讀取方法')

    def write(self):
        print('文本數據的讀取方法')
View Code
 
抽象類:
   python中抽象類須要藉助模塊來實現,抽象類是一種特殊的類,它的特殊之處是隻能被繼承不能別實例化.
import abc                         ##引入abc模塊
class File(metaclass=abc.ABCMeta):
    @abc.abstractmethod        ##
    def read(self):
        pass

    @abc.abstractmethod
    def write(self):
        pass


class Txt(File): #文本,具體實現read和write
    def read(self):
        pass
    def write(self):
        pass
t=Txt()
View Code
相關文章
相關標籤/搜索