天天看點

Python學習(27)--面向對象程式設計4Python學習(27)--面向對象程式設計4

這一節我們來繼續介紹面向對象程式設計。涉及到的内容有property屬性和運算符的重載。

1.property屬性

之前的面向對象程式設計中,我們介紹了兩種通路屬性的方式。第一種是對象名.屬性名,這種直接通路屬性的方式;第二種是使用get和set方法通路屬性。第二種方式代碼的靈活性比第一種要高,并且第二種方式可以通路私有屬性,保證了資料的安全性。但是第一種方式代碼的可讀性要高,尤其是大工程中,需要閱讀和編寫大量的代碼,第一種方式在代碼效率方面有明顯的優勢。那有沒有可能一種方式使代碼的靈活性,安全性,可讀性同時具備呢?Python中的property屬性就提供了這種可能。

使用property屬性,在通路私有屬性時仍然可以使用第一種直接通路的方式,但通路屬性時調用的是具體的方法,而并不是像通路非私有屬性那樣簡單的讀值和寫值。下面我們來通過一個例子來介紹property屬性的使用方式。代碼例子如下:

<b>[python]</b> view plain copy

class Person():

    def __init__(self,age):

        self.__age=age

    @property

    def age(self):#讀取屬性__age的值,相當于方法getAge()

        return self.__age

    @age.setter#設定屬性__age的值,相當于方法setAge()

    def age(self,age):

        if(age&lt;0):

            age=0

per=Person(10)

per.age=-100#修改屬性__age,調用方法age(age)

print(per.age)#讀取屬性__age,調用方法age()

如上為一個利用property屬性直接通路私有屬性的例子。主要分為以下幾個步驟,如下:

①定義一個讀取私有屬性值的方法S,功能與get方法相同,并使用property修飾方法S。

如上代碼,定義了一個讀取私有屬性__age值的方法age(),并使用@property來修飾方法age()。

②定義一個用于設定私有屬性值方法S',,功能與set方法相同,并使用@S.setter來修飾這個方法S'。

如上代碼,定義了一個修改私有屬性__age值的方法age(age),并使用@age.setter來修飾方法age(age)。

③讀取私有屬性__age時,采用直接通路的方式:對象名.S,這時會調用方法S;

修改私有屬性__age時,采用直接通路的方式:對象名.S'=新屬性值,這時會調用方法S'。

如上代碼,person.age=-100修改__age屬性值,這時會調用方法age(age);person對象讀取__age值:person.age,會調用方法age()。注意,S和S'的方法名一般與屬性名相同,這樣通路私有屬性時,就可以按照對象名.屬性名這種直接通路的方式通路屬性。方法S和S'都是通路私有屬性的實作,相當于get和set方法,使用property屬性可以讓我們像直接通路屬性那樣通路方法。代碼列印結果如下:

Python學習(27)--面向對象程式設計4Python學習(27)--面向對象程式設計4

2.運算符重載

在Python中有時類的對象之間可能需要進行運算操作,但實際上對象間的運算是其屬性間的運算。實作類的對象間的運算,需要重載類中的方法。例如兩個對象進行加操作,需要重載方法__add__(self,other),形參self和other分别代表兩個對象。如下:

    def __add__(self, other):#重載方法__add__()

        return self.__age+other.__age

per1=Person(10)

per2=Person(12)

print(per1+per2)#兩個對象進行加操作,會調用重載後的方法__add__()

print(per1.__add__(per2))#直接調用方法__add__(),與兩個對象的加運算操作是相同的

如上,在Person類中重載了兩個對象進行加操作的方法__add__(),實作的具體操作為将兩個對象的年齡相加。對象per1和per2進行加操作:per1+per2,會調用調用Person類中重載後的方法__add__(),per1.__add__(per2)這種直接調用__add__()實作兩個對象相加的方式,與直接使用運算符實作對象相加的結果是一緻的。但使用運算符+的代碼顯然更加簡潔明了。代碼列印結果如下:

Python學習(27)--面向對象程式設計4Python學習(27)--面向對象程式設計4

更多有關運算符重載的方法,如下表:

Python學習(27)--面向對象程式設計4Python學習(27)--面向對象程式設計4
Python學習(27)--面向對象程式設計4Python學習(27)--面向對象程式設計4

至此,有關面向對象程式設計的内容基本介紹完了,下一節我們将介紹tinkinter圖形界面程式設計,敬請期待。