1. 程式人生 > >讓物件支援with語句

讓物件支援with語句

複製程式碼
一、with語句的好處
with語句的好處在於,它可以自動幫我們釋放上下文,就比如檔案控制代碼的操作,
如果你不使用with語句操作,你要先open一個檔案控制代碼,使用完畢後要close這個檔案控制代碼,
而使用with語句後,退出with程式碼塊的時候就會自動幫你釋放掉這個檔案控制代碼。
場景使用:
    網路連線、資料庫連線、檔案控制代碼、鎖



二、如何讓物件支援with語句
方法:
在建立類的時候,在內部實現__enter__方法,with語句一開始就會執行這個方法,
再實現__exit__方法,退出with程式碼塊的時候會自動執行這個方法。

例子:
class A: def __enter__(self): print('with語句開始') return self # 返回self就是把這個物件賦值給as後面的變數 def __exit__(self, exc_type, exc_val, exc_tb): print('with語句結束') with A() as f: print('IG牛批') print(f) print('IG真的牛批') 結果: with語句開始 IG牛批 <__main__.A object at 0x0000027B4D1596D8> with語句結束 IG真的牛批 三、使用with語句優化pymysql的操作
1、使用with語句連線pymysql資料庫基本操作 import pymysql class SQLManager(object): # 初始化例項的時候呼叫connect方法連線資料庫 def __init__(self): self.conn = None self.cursor = None self.connect() # 連線資料庫 def connect(self): self.conn = pymysql.connect( host
='127.0.0.1', port=3306, database='mydb', user='root', password='123abc', charset='utf8' ) self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor) # 關閉資料庫 def close(self): self.cursor.close() self.conn.close() # 進入with語句自動執行 def __enter__(self): return self # 退出with語句自動執行 def __exit__(self, exc_type, exc_val, exc_tb): self.close() 2、還可以在上面的基礎上實現pymysql的一些操作 class SQLManager(object): # 初始化例項方法 def __init__(self): self.conn = None self.cursor = None self.connect() # 連線資料庫 def connect(self): self.conn = pymysql.connect( host='127.0.0.1', port=3306, database='mydb', user='root', password='123abc', charset='utf8' ) self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor) # 查詢多條資料sql是sql語句,args是sql語句的引數 def get_list(self, sql, args=None): self.cursor.execute(sql, args) result = self.cursor.fetchall() return result # 查詢單條資料 def get_one(self, sql, args=None): self.cursor.execute(sql, args) result = self.cursor.fetchone() return result # 執行單條SQL語句 def moddify(self, sql, args=None): self.cursor.execute(sql, args) self.conn.commit() # 執行多條SQL語句 def multi_modify(self, sql, args=None): self.cursor.executemany(sql, args) self.conn.commit() # 建立單條記錄的語句 def create(self, sql, args=None): self.cursor.execute(sql, args) self.conn.commit() last_id = self.cursor.lastrowid return last_id # 關閉資料庫cursor和連線 def close(self): self.cursor.close() self.conn.close() # 進入with語句自動執行 def __enter__(self): return self # 退出with語句塊自動執行 def __exit__(self, exc_type, exc_val, exc_tb): self.close()
複製程式碼

 

複製程式碼
一、with語句的好處
with語句的好處在於,它可以自動幫我們釋放上下文,就比如檔案控制代碼的操作,
如果你不使用with語句操作,你要先open一個檔案控制代碼,使用完畢後要close這個檔案控制代碼,
而使用with語句後,退出with程式碼塊的時候就會自動幫你釋放掉這個檔案控制代碼。
場景使用:
    網路連線、資料庫連線、檔案控制代碼、鎖



二、如何讓物件支援with語句
方法:
在建立類的時候,在內部實現__enter__方法,with語句一開始就會執行這個方法,
再實現__exit__方法,退出with程式碼塊的時候會自動執行這個方法。

例子:
class A:
    def __enter__(self):
        print('with語句開始')
        return self  # 返回self就是把這個物件賦值給as後面的變數

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with語句結束')


with A() as f:
    print('IG牛批')
    print(f)
print('IG真的牛批')

結果:
with語句開始
IG牛批
<__main__.A object at 0x0000027B4D1596D8>
with語句結束
IG真的牛批



三、使用with語句優化pymysql的操作
1、使用with語句連線pymysql資料庫基本操作
import pymysql

class SQLManager(object):
    # 初始化例項的時候呼叫connect方法連線資料庫
    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()
        
    # 連線資料庫
    def connect(self):
        self.conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            database='mydb',
            user='root',
            password='123abc',
            charset='utf8'
        )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 關閉資料庫
    def close(self):
        self.cursor.close()
        self.conn.close()
        
    # 進入with語句自動執行    
    def __enter__(self):
        return self
        
    # 退出with語句自動執行    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()


2、還可以在上面的基礎上實現pymysql的一些操作
class SQLManager(object):

    # 初始化例項方法
    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()

    # 連線資料庫
    def connect(self):
        self.conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            database='mydb',
            user='root',
            password='123abc',
            charset='utf8'
        )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 查詢多條資料sql是sql語句,args是sql語句的引數
    def get_list(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchall()
        return result

    # 查詢單條資料
    def get_one(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchone()
        return result

    # 執行單條SQL語句
    def moddify(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()

    # 執行多條SQL語句
    def multi_modify(self, sql, args=None):
        self.cursor.executemany(sql, args)
        self.conn.commit()

    # 建立單條記錄的語句
    def create(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()
        last_id = self.cursor.lastrowid
        return last_id

    # 關閉資料庫cursor和連線
    def close(self):
        self.cursor.close()
        self.conn.close()

    # 進入with語句自動執行
    def __enter__(self):
        return self
    
    # 退出with語句塊自動執行
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()
複製程式碼