標籤:就是 私人化 passwd 執行個體變數 __init__ python 私人 class ica
以前都是面向過程編程,做一件事是按順序來的,必須經過很多操作。現在是物件導向編程,將各種操作集合在一起,然後指揮其適用於多個情境。
上課時老師舉了一個蠻貼切的例子,比如買車,面向過程就是先去學車,然後去4s店買車,然後去辦證,然後保險,然後臨時牌照,然後正式牌照。物件導向就像將這些所有步驟會經曆的情境整合起來,直接開一個車輛
購置辦證中心,然後從學車到辦證甚至以後的繳納罰款全都在這裡處理。
在我的理解,物件導向就是給一些有共同性的事物先造一個模型,這個模型有這些事物共同的屬性,也有這些事物共同的處理方法。然後一旦需要針對某個事物單獨操作時,只要調用
這個模型,這個事物就可以根據已經配好的屬性和方法很快的建造起來。
物件導向編程有幾個基礎的點,分別是類、建構函式、屬性、方法、執行個體化。細化分還有類變數、執行個體變數、類方法、執行個體方法、解構函式、私人化、繼承等等。
1、類
類是利用class定義的,如num1和num2,這兩者的區別是類num2後面的括弧裡有“object”,前者被稱為經典類,後者被稱為新式類。沒有很大的區別。
1 class num1(): 2 pass3 4 class num2(object):5 pass
2、屬性
屬性其實就是變數,包括類變數(直接在類中定義的變數)和執行個體變數(在“def __init__(self):”下定義的變數)。
比如一個班有很多個學生,都生活在成都,學生們的年級、班級和年齡假設都是一樣的,那麼這些就是學生的共同屬性,可以用變數先定義。
1 class Students():2 county = ‘China‘ # 類變數,公開變數,每個執行個體都能用,可以節省記憶體3 def __init__(self):4 self.class = ‘高三二班‘ # 執行個體變數5 self.age = 18
3、方法
如果我們要列印這個班學生的姓名、班級和年齡。那麼就得創造一個方法,也是一個函數。比如下面的print_info函數,就可以列印出每個對象的姓名、班級和年齡。
1 class Students(): 2 county = ‘China‘ # 類變數,公開變數,每個執行個體都能用,可以節省記憶體 3 def __init__(self, name): 4 self.class = ‘高三二班‘ # 執行個體變數 5 self.age = 18 6 self.name = name 7 8 def print_info(self): 9 print(‘學生的姓名是%s‘ % self.name)10 print(‘學生的班級是%s‘ % self.class)11 print(‘學生的年齡是%s‘ % self.age)
4、執行個體化
每一個類都是必須執行個體化才能使用的,不能那種車輛模型開車上路對吧,還是要有一輛真正的車才行。執行個體化就相當於對比著自己喜歡的模型得到一個真實的物品,這個物品是根據模型對比購買的,所以它擁有和模型同樣的顏色、模樣等等。所以執行個體化的對象是擁有類裡面的屬性和方法的。
1 class Students(): 2 county = ‘China‘ # 類變數,公開變數,每個執行個體都能用,可以節省記憶體 3 def __init__(self, name): 4 self.class = ‘高三二班‘ # 執行個體變數 5 self.age = 18 6 self.name = name 7 8 def print_info(self): 9 print(‘學生的姓名是%s‘ % self.name)10 print(‘學生的班級是%s‘ % self.class)11 print(‘學生的年齡是%s‘ % self.age)12 13 zxm = Student(name = ‘張曉明‘) # 執行個體化14 print(zxm.class) # 輸出結果為1815 zxm.print_info() # 會列印zxm這個對象的姓名、班級、年齡
5、建構函式和解構函式
建構函式就是類執行個體化時啟動並執行函數,解構函式就是銷毀執行個體化對象的函數。一般串連資料庫後需要關閉資料庫,這裡可以將關閉資料庫的代碼放在解構函式中,這樣執行完畢後自動銷毀執行個體同時自動關閉連結。
1 class MyDb(object): 2 # 解構函式 3 def __del__(self): 4 self.cur.close() 5 self.coon.close() 6 print(‘over....‘) 7 # 建構函式 8 def __init__(self, 9 host,user,passwd,db,10 port=3306,charset=‘utf8‘):11 try:12 self.coon = pymysql.connect(13 host=host,user=user,passwd=passwd,14 port=port,db=db,charset=charset,15 autocommit=True # 自動認可,在非select語句時可以不需要再commit了16 )17 except Exception as e:18 print(‘資料庫連結失敗!%s‘ % e)19 else:20 self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)
6、私人
變數分私人變數和公有變數,顧名思義,私人變數就是只能在類裡面調用的不可修改的變數,而公有變數是在類外對象也可以調用修改的變數。私人變數的定義方法就是在變數名前面加兩個底線。
1 import redis 2 class My(object): 3 def __init__(self): 4 self.__host = ‘***.*.**.**‘ # 私人變數 5 self.__port = 6379 6 self.__password = ‘*******‘ 7 8 self.r = redis.Redis(host=self.host,port=self.port,password=self.password) 9 10 def get(self, k):11 res = self.r.get(k)12 if res:13 return res.decode()14 return None
1 my = My() #執行個體化2 my.port = 9999 # port是私人變數無法修改3 print(my.__host) # host是私人變數,無法在類外調用4 my.__close() # close是私人方法,無法在類外調用
7、繼承
定義新式類時括弧中一般會寫“object”,其實這就是定義的類繼承了object類。所以寫在括弧中的類就是定義的類所要繼承的類。被繼承的類可以成為父類或者基類,新的類成為子類。子類可以繼承父類的所有屬性和方法,並可以定義自己的屬性和方法且不會影響父類。
比如下面,定義了一個串連資料庫的基礎類,這個類有一些屬性如host、port、password等等。而不論串連mysql資料庫或者redis資料庫都會用到這些屬性。那麼定義MySQL類和redis類時就可以直接繼承Base類,這樣host、port、password這些屬性就可以直接使用了。
1 class Base(object): 2 def __init__(self, host, port, password): 3 self.host = host 4 self.port = port 5 self.password = password 6 7 8 class Mysql(Base): 9 pass10 11 12 class Redis(Base):13 pass
介面測試學習-python第七課(物件導向編程)