python資料結構----------抽象資料型別和python類
阿新 • • 發佈:2019-01-03
廢話
最近在看python資料結構的書,第二章是複習python面向物件程式設計,其中提到了python面向物件程式設計的特點(封裝成模組,我的理解就是把跟某一個功能相關的操作都封裝成一個類,對外部需要使用該功能的人來說,只需要呼叫提供的介面 其實就是呼叫這個類,不用關心內部具體是如何實現的)
之前對面向物件程式設計學的就不是很好,現在重新看,發現也沒有那麼難了,,,哈哈哈
實現一個有理數類
先來看一個例子:(關於定義有理數類,包括有理數的定義,這裡是用兩個整數分別表示分子和分母,然後又定義了有理數相關的操作,包括加減乘除等)
另外 對於python中:python語言為所有的運算子(當然也包括算術運算子)都規定了特殊方法名!!!
我的理解就是當你在類中定義相關內部函式比如: –add–(雙下劃綫) 其實就是對應了算術運算子的+操作符~~
python實現
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 30 09:43:41 2018
@author: xuanxuan
"""
class Rational:
@staticmethod
def _gcd(m,n):
if n==0:
m,n=n,m
while m!=0:
m,n=n%m,m
return n
def __init__(self,num,den):
if not isinstance(num,int) or not isinstance(den,int):
raise TypeError
if den==0:
raise ZeroDivisionError
sign=1
if num<0:
num,sign=-num,-sign
if den <0:
den,sign=-den,-sign
g=Rational._gcd(num,den)
self._num=sign*(num//g)
self._den=den//g
def num(self):
return self._num
def den(self):
return self._den
def __add__(self,another):
num=self._num*another.den()+self._den*another.num()
den=self._den*another.den()
return Rational(num,den)
def __mul__(self,another):
return Rational(self._num*another.num(),self._den*another.den())
def __floordiv__(self,another):
if another.num()==0:
raise ZeroDivisionError
return Rational(self._num*another.den(),self._den*another.num())
def __eq__(self,another):
return self._num*another.den()==self._den*another.num()
def __lt__(self,another):
return self._num*another.den()<self._den*another.num()
def __str__(self):
return str(self._num)+'/'+str(self._den)
def print(self):
print(self._num,'/',self._den)
if __name__=="__main__":
x=Rational(2,4)
print("the final result is",Rational(4,5)+x)
筆記
[email protected] 是在非例項方法之前定義,區別於類中定義的其他例項方法,該非例項方法又稱為靜態方法,主要是作為一個區域性函式來使用,為類中其他的例項方法打輔助的,哈哈哈哈‘
2.其實可以發現類中有兩種型別的變數,self.num和num 前者是在整個類中使用的,作為某一個例項物件的變數在類中使用,而num變數其實就是類似於中間變數,為類中其他函式或變數服務的,,,他們之間的區別就好像例項方法和靜態方法的區別,不知道理解的對不對~~~