Đọc về tuyên bố với tuyên bố. Bạn đang mô tả trường hợp sử dụng của nó.
Bạn sẽ cần kết nối kết nối của mình trong lớp "Trình quản lý bối cảnh" xử lý các phương thức __enter__
và __exit__
được sử dụng bởi câu lệnh with
.
Xem PEP 343 để biết thêm thông tin.
Chỉnh sửa
"Đối tượng của tôi không được sử dụng đơn giản như Close mở, nhưng được giữ như một thành viên của một đối tượng khác, lớn hơn"
class AnObjectWhichMustBeClosed[ object ]:
def __enter__[ self ]:
# acquire
def __exit__[ self, type, value, traceback ]:
# release
def open[ self, dbConnectionInfo ]:
# open the connection, updating the state for __exit__ to handle.
class ALargerObject[ object ]:
def __init__[ self ]:
pass
def injectTheObjectThatMustBeClosed[ self, anObject ]:
self.useThis = anObject
class MyGuiApp[ self ]:
def run[ self ]:
# build GUI objects
large = ALargeObject[]
with AnObjectWhichMustBeClosed[] as x:
large.injectTheObjectThatMustBeClosed[ x ]
mainLoop[]
Một số người gọi đây là "tiêm phụ thuộc" và "đảo ngược kiểm soát". Những người khác gọi đây là mô hình chiến lược. "ObjectthatMustBeclosed" là một chiến lược, được cắm vào một số đối tượng lớn hơn. Việc lắp ráp được tạo ra ở cấp cao nhất của ứng dụng GUI, vì đó thường là nơi các tài nguyên như cơ sở dữ liệu được mua lại.Strategy pattern. The "ObjectThatMustBeClosed" is a strategy, plugged into some larger object. The assembly is created at a top-level of the GUI app, since that's usually where resources like databases are acquired.
Nó thực sự phụ thuộc vào thư viện bạn đang sử dụng. Một số trong số họ có thể tự đóng kết nối [lưu ý: Tôi đã kiểm tra thư viện SQLite3 tích hợp và không có gì]. Python sẽ gọi một kẻ phá hủy khi một đối tượng đi ra khỏi phạm vi và các thư viện này có thể thực hiện một chất hủy diệt đóng các kết nối một cách duyên dáng.
Tuy nhiên, đó có thể không phải là trường hợp! Tôi muốn giới thiệu, như những người khác có trong các bình luận, để bọc nó trong một đối tượng.
class MyDB[object]:
def __init__[self]:
self._db_connection = db_module.connect['host', 'user', 'password', 'db']
self._db_cur = self._db_connection.cursor[]
def query[self, query, params]:
return self._db_cur.execute[query, params]
def __del__[self]:
self._db_connection.close[]
Điều này sẽ khởi tạo kết nối cơ sở dữ liệu của bạn khi bắt đầu và đóng nó khi nơi mà đối tượng của bạn được khởi tạo nằm ngoài phạm vi. Lưu ý: Nếu bạn khởi tạo đối tượng này ở cấp độ mô -đun, nó sẽ tồn tại cho toàn bộ ứng dụng của bạn. Trừ khi điều này được dự định, tôi sẽ đề nghị tách các chức năng cơ sở dữ liệu của bạn với các chức năng không phải là cơ sở dữ liệu.
May mắn thay, Python đã tiêu chuẩn hóa API cơ sở dữ liệu, vì vậy điều này sẽ hoạt động với tất cả các DB tuân thủ cho bạn :]
❮ Php mysqli tham khảo
Ví dụ - Phong cách định hướng đối tượng
Đóng kết nối cơ sở dữ liệu đã mở trước đó:
?>
Nhìn vào ví dụ về phong cách thủ tục ở phía dưới.
Định nghĩa và cách sử dụng
Hàm đóng [] / mysqli_close [] đóng kết nối cơ sở dữ liệu đã mở trước đó.
Cú pháp
Phong cách định hướng đối tượng:
Phong cách thủ tục:
Giá trị tham số
sự liên quan | Yêu cầu. Chỉ định kết nối MySQL để đóng |
Chi tiết kỹ thuật
Đúng về thành công. Sai về thất bại |
5+ |
Ví dụ - Phong cách thủ tục
Đóng kết nối cơ sở dữ liệu đã mở trước đó:
?>
❮ Php mysqli tham khảo
Nhỏ bé. Nhanh. Đáng tin cậy.CHOOSE bất kỳ ba.
Choose any three.
Giao diện SQLite C
int sqlite3_close[sqlite3*]; int sqlite3_close_v2[sqlite3*];
Các thói quen sqlite3_close [] và sqlite3_close_v2 [] là bộ hủy diệt cho đối tượng SQLite3. Các cuộc gọi đến sqlite3_close [] và sqlite3_close_v2 [] trả về sqlite_ok nếu đối tượng sqlite3 bị phá hủy thành công và tất cả các tài nguyên liên quan đều được giải quyết.
Lý tưởng nhất, các ứng dụng nên hoàn thiện tất cả các câu lệnh đã chuẩn bị, đóng tất cả các tay cầm blob và hoàn thành tất cả các đối tượng sqlite3_backup được liên kết với đối tượng sqlite3 trước khi cố gắng đóng đối tượng. Nếu kết nối cơ sở dữ liệu được liên kết với các câu lệnh được chuẩn bị không chính xác, trình xử lý blob và/hoặc các đối tượng sqlite3_backup chưa hoàn thành thì sqlite3_close [] sẽ để kết nối cơ sở dữ liệu mở và trả về sqlite_busy. Sqlite3_close_v2 [] được gọi với các câu lệnh được chuẩn bị không chính xác, trình xử lý blob không được xử lý và/hoặc sqlite3_backups chưa hoàn thành, nó sẽ trả về SQLite_OK bất kể, nhưng thay vì xử lý kết nối cơ sở dữ liệu ngay lập tức Tự động phân bổ kết nối cơ sở dữ liệu sau khi tất cả các câu lệnh được chuẩn bị được hoàn tất, tất cả các tay cầm blob đều được đóng và tất cả các bản sao lưu đã hoàn thành. Giao diện SQLite3_Close_v2 [] được sử dụng để sử dụng với các ngôn ngữ máy chủ được thu thập và nơi thứ tự được gọi là chất phá hủy được gọi là tùy ý.
Nếu một đối tượng SQLite3 bị phá hủy trong khi giao dịch được mở, giao dịch sẽ tự động quay lại.
Tham số C thành sqlite3_close [c] và sqlite3_close_v2 [c] phải là một con trỏ null hoặc con trỏ đối tượng sqlite3 thu được từ sqlite3_open [], sqlite3_open16 [] Gọi sqlite3_close [] hoặc sqlite3_close_v2 [] với đối số con trỏ null là vô hại.
Xem thêm Danh sách các đối tượng, hằng số và các chức năng.