天天看點

python基礎知識(四)(面向對象)

一、簡介

  • 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的執行個體。
  • 方法:類中定義的函數。
  • 類變量:類變量在整個執行個體化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為執行個體變量使用。
  • 資料成員:類變量或者執行個體變量用于處理類及其執行個體對象的相關的資料。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆寫(override),也稱為方法的重寫。
  • 局部變量:定義在方法中的變量,隻作用于目前執行個體的類。
  • 執行個體變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為執行個體變量,是在類聲明的内部但是在類的其他成員方法之外聲明的。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模拟"是一個(is-a)"關系(例圖,Dog是一個Animal)。
  • 執行個體化:建立一個類的執行個體,類的具體對象。
  • 對象:通過類定義的資料結構執行個體。對象包括兩個資料成員(類變量和執行個體變量)和方法。

二、 類

1. 類屬性與方法

類屬性分為公共和私有兩種,

  1. 類私有屬性

    __private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接通路。在類内部的方法中使用時 self.__private_attrs。

  2. 類方法

    在類地内部,使用 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 ,且為第一個參數, 代表的是類的執行個體。 的名字并不是規定死的,也可以使用 ,但是最好還是按照約定是用 。

  3. 類的私有方法

    __private_method:兩個下劃線開頭,聲明該方法為私有方法,隻能在類的内部調用 ,不能在類地外部調用。self.__private_methods。

  4. 執行個體
class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0    # 公開變量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 報錯,執行個體不能通路私有變量

********************************************************************

1
2
2
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    print (counter.__secretCount)  # 報錯,執行個體不能通路私有變量
AttributeError: 'JustCounter' object has no attribute '__secretCount'      

三、繼承 重寫

1.單繼承

Python 同樣支援類的繼承,如果一種語言不支援繼承,類就沒有什麼意義。派生類的定義如下所示:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>      

需要注意圓括号中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查找基類中是否包含方法。

執行個體

#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行通路
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調用父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()

***********************************************************

ken 說: 我 10 歲了,我在讀 3 年級      

2. 多繼承

Python同樣有限的支援多繼承形式。多繼承的類定義形如下例:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>      

執行個體

#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行通路
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調用父類的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))
 
#另一個類,多重繼承之前的準備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s"%(self.name,self.topic))
 
#多重繼承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,預設調用的是在括号中排前地父類的方法

******************************************************************

我叫 Tim,我是一個演說家,我演講的主題是 Python      

3. 方法重寫

class Parent:        # 定義父類
   def myMethod(self):
      print ('調用父類方法')
 
class Child(Parent): # 定義子類
   def myMethod(self):
      print ('調用子類方法')
 
c = Child()          # 子類執行個體
c.myMethod()         # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆寫的方法      

四、類的專有方法

__init__ : 構造函數,在生成對象時調用
__del__ : 析構函數,釋放對象時使用
__repr__ : 列印,轉換
__setitem__ : 按照索引指派
__getitem__: 按照索引擷取值
__len__: 獲得長度
__cmp__: 比較運算
__call__: 函數調用
__add__: 加運算
__sub__: 減運算
__mul__: 乘運算
__truediv__: 除運算
__mod__: 求餘運算
__pow__: 乘方