標籤:fetchall ict @class imp print 建構函式 檔案 passwd IV
1、類方法串連資料庫
先說一下解構函式
def __del__(self): pass
解構函式,在執行個體被銷毀的時候執行,那麼對於串連資料庫,在執行個體執行後,需要關閉遊標和資料庫連接,這兩個操作就可以放到解構函式裡面
import pymysqlclass Mydb(object): def __del__(self): #解構函式,執行個體被銷毀的時候執行的 self.cur.close() self.coon.close() print(‘over‘) def __init__(self,host,user,passwd,db, port=3306,charset=‘utf8‘): try: self.coon=pymysql.connect( host=host,user=user,passwd=passwd,port=port, charset=charset,db=db,autocommit=True ) #autocommit 自動認可,寫語句的時候自動認可 except Exception as e: print(‘資料庫連接失敗!%s‘%e) else: self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor) def exsql(self,sql): try: self.cur.execute(sql) except Exception as e: print(‘sql語句有問題,%s‘%sql) else: self.res=self.cur.fetchall() return self.resmy=Mydb(‘xxx‘,‘jxz‘,‘123456‘,‘jxz‘)my.exsql(‘select * from stu;‘)print(‘我是最後一行代碼‘)
在建構函式裡,進行資料庫連接,並做異常處理,在執行sql語句函數中進行sql語句執行,解構函式中操作關閉遊標和資料庫連接。
在串連資料庫的時候,有一個新的知識點:autocommit=True 自動認可,這個在以前寫的資料庫連接使用中並未提到,代替了之前需要判斷是否是select語句,是否需要提交。
2、if __name__==‘__main__‘用法
if __name__==‘__main__‘:
一般在做測試或者調試的時候用
如果是直接運行這個python檔案,這句話就沒有什麼用處
正常在python檔案中匯入其他python檔案,且該python檔案會正常執行
但是如果匯入的python檔案裡有 if __name__==‘__main__‘: 這個執行結果,那麼匯入的這個python檔案就不會執行
3、類變數,執行個體變數及執行個體方法
1)概念
類變數: 公用的變數,每個執行個體都可以用
執行個體變數:成員變數
執行個體方法:執行個體化後才能用
2)self
self代表的是本類對象,因為函數裡面的變數都是局部變數,出了函數就不能用了,用self給對象綁定了之後,就可以self.xx隨便用了
self與執行個體對象的記憶體位址是一樣的
class Baby(): def __init__(self,name): print(‘self的記憶體位址‘,id(self))dcg=Baby(‘測試‘)print(‘測試的記憶體位址‘,id(dcg))
輸出結果為:
self的記憶體位址 801098625712測試的記憶體位址 801098625712
3)類變數,執行個體變數及執行個體方法使用
class Baby(): country =‘China‘ #類變數,公用的變數,每個執行個體都可以用 def my(self): self.name=‘liujia‘abc=Baby() print(abc.country) #使用類變數的值Baby.country=‘USA‘ #類變數可以直接通過類名.xxx來進行修改yjt=Baby()print(yjt.country) #類變數已經修改為USAdcg=Baby()dcg.country=‘Japan‘ #執行個體變數print(dcg.country)
看以上這段代碼,country變數是類下面,但沒有在其他函數裡面,是類變數,每個執行個體都可以用;
my()函數是一個執行個體方法,在執行個體化後才能使用;
先看執行個體化為abc後,列印country,那麼使用的是類變數,輸出為China;然後類變數進行了修改,這時候執行個體化為yjt,輸出的country就是USA,最後執行個體化為
dcg,這個執行個體修改了country的值,最後輸出的country就是Japan。
4)裝飾器 4、類方法,靜態方法1)概念
類方法:
不用執行個體化就可以直接調用
可以通過cls使用類變數
不能調用執行個體方法
不想執行個體化的時候,可以定義成類方法
靜態方法:
一個普通函數,只是寫在類裡面,用不了類變數,類方法,執行個體變數和執行個體方法
2)類方法
class Baby(): country =‘China‘ #類變數,公用的變數,每個執行個體都可以用 @classmethod def xm(cls):#cls代表的就是Baby,類方法 print(cls.country) print(‘我是類方法‘)
類方法可以不用執行個體化,直接調用
Baby.xm() #不執行個體化,直接類名調用xm這個方法
輸出結果為:
China我是類方法
當然也可以先執行個體化,再調用
dcg=Baby()dcg.xm() #執行個體化後,在通過執行個體化後的對象調用xm方法
輸出也是一樣的
還有一點是,類方法裡面不能調用執行個體變數和執行個體方法,比如
class Baby(): country =‘China‘ #類變數,公用的變數,每個執行個體都可以用 def my(self): self.name=‘liujia‘ def cry(self): print(‘hhh‘) @classmethod def xm(cls):#cls代表的就是Baby,類方法 print(cls.country) print(‘我是類方法‘) cls.name #調用不了執行個體變數 cls.cry()#調用不了執行個體方法Baby.xm()
不管是cls.name,還是cls.cry(),但是會運行報錯的
3)靜態方法
class Baby(): @staticmethod #靜態方法 def xh(): print(‘這是靜態方法,它和一個沒寫在類裡面的函數一樣‘)
可以注意到這個類裡面的函數是沒有self這個本類對象的,它就是一個普通的函數,但是也還是需要執行個體化後才能調用
並且調用執行個體變數,執行個體方法等都是不可以的
class Baby(): country =‘China‘ #類變數,公用的變數,每個執行個體都可以用 def my(self): self.name=‘liujia‘ def cry(self): print(‘hhh‘) @staticmethod #靜態方法 def xh(): print(‘這是靜態方法,它和一個沒寫在類裡面的函數一樣‘) self.name self.cry()
self.name和self.cry()但是會報錯的
python學習(二十九)類方法串連資料庫及物件導向編程(2)