天天看點

Python學習:類和繼承

Python中的類提供了面向對象程式設計的所有基本功能:類的繼承機制允許多個基類,派生類可以覆寫基類中的任何方法,方法中可以調用基類中的同名方法。

對象可以包含任意數量和類型的資料。

1.類對象

類對象支援兩種操作:屬性引用和執行個體化。

屬性引用使用和 Python 中所有的屬性引用一樣的标準文法:obj.name。

類對象建立後,類命名空間中所有的命名都是有效屬性名。

是以如果類定義是這樣:

class Myclass:
    i=123
    def pzl(self):
        return 'Hello World'

x=Myclass()#執行個體化
print(x.i)
print(x.pzl())

#輸出:
123
Hello World
None      

2.類的方法

在類地内部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,

class Myclass:
    n=0              #基本屬性
    __w='private'    #私有屬性
    def __init__(self,ta,tb):
        self.a=ta
        self.b=tb
    def pzl(self,tc):
        return self.a+self.b+tc

x=Myclass(3,4)
x.n=5
print(x.pzl(5))
print(x.n)
print(x._w)          #不可引用報錯

#輸出:
12
5
Traceback (most recent call last):
  File "E:/PycharmProjects/test1/test1.py", line 15, in <module>
    print(x._w)
AttributeError: 'Myclass' object has no attribute '_w'      
  • 方法中的這個self參數,就是對調用該方法(method)的執行個體對象(instance)的一個引用(reference)。就是self.x的值為這個執行個體類的内部變量,内部函數都可以使用
  • 外部輸入的值如果想要整個執行個體類都可以用的就要用self指派
  • 類定義了 init() 方法的話,類的執行個體化操作會自動調用 init() 方法
  • __w 私有屬性,外部不可以通路

3.繼承

所有類都預設從object繼承,​

​MyClass.__bases__​

​檢視MyClass類的父類

import os,sys
class Myclass:
    n=0              #基本屬性
    __w='private'    #私有屬性
    def __init__(self,ta,tb):
        self.a=ta
        self.b=tb
    def pzl(self,tc):    #相加a,b,c
        return self.a+self.b+self.tc
    def speak(self):     #相加a,b
        return self.a+self.b
class Son_Myclass(Myclass):
    def __init__(self,ta,tb,tc):
        Myclass.__init__(self,ta,tb)
        self.c=tc
    def pzl(self):       #子類重寫,相加a,b,c
        return self.a+self.b+self.c
x=Son_Myclass(3,4,5) #實作3,4,5相加用繼承類

print(x.pzl())
print(x.speak()) #繼承類繼承了父類的speak即使自己并沒有speak函數

#輸出
12
7      

4.多繼承

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

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

5.類屬性與方法

類的私有屬性

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

類的方法

在類地内部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數

類的私有方法

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

  • init : 構造函數,在生成對象時調用
  • del : 析構函數,釋放對象時使用
  • repr : 列印,轉換
  • setitem : 按照索引指派
  • getitem: 按照索引擷取值
  • len: 獲得長度
  • cmp: 比較運算
  • call: 函數調用
  • add: 加運算
  • sub: 減運算
  • mul: 乘運算
  • div: 除運算
  • mod: 求餘運算
  • pow: 乘方

6.運算符重載

class Vector:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __str__(self):
        return '%d'%(self.a+self.b)
    def __add__(self, other):
        return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2, 2)
v2 = Vector(1, 1)
print(v1 + v2)

#輸出
6