Python lưu thể hiện của lớp vào tệp

Trong bài viết này, chúng tôi giới thiệu cho bạn về tuần tự hóa đối tượng trong Python và giải thích tại sao nó lại quan trọng. Tuần tự hóa về cơ bản là một cách lưu trữ dữ liệu hoặc đối tượng và là một kỹ thuật hữu ích để lưu các đối tượng phức tạp. Đó là quá trình chuyển đổi một đối tượng thành luồng byte có thể được lưu trữ, chẳng hạn như trong bộ nhớ hoặc tệp. Sau đó, tệp này có thể được xây dựng lại hoặc giải tuần tự hóa để truy xuất đối tượng ban đầu, sau đó được sử dụng lại trong các chương trình khác nhau hoặc thậm chí các môi trường khác nhau

Dưới đây, chúng tôi chỉ cho bạn một số ví dụ về cách sử dụng một số công cụ phổ biến nhất để tuần tự hóa trong Python. Nếu bạn chưa quen với Python và muốn xây dựng kỹ năng xử lý dữ liệu của mình, hãy xem bản nhạc này. Nó dạy cho bạn tất cả những gì bạn cần biết về xử lý các định dạng tệp khác nhau bằng Python

Lớp cơ bản

Hãy nhớ rằng Python là một ngôn ngữ hướng đối tượng; . Điều này có nghĩa là bạn có thể tuần tự hóa dữ liệu được lưu trữ trong danh sách, từ điển hoặc thậm chí các thể hiện của lớp

Hãy tham gia và tạo một lớp học lái xe ô tô. Trọng tâm của bài viết này không phải là về các lớp học, vì vậy nếu bạn muốn biết thêm chi tiết về cách hoạt động của các lớp học, hãy xem bài viết này. Chúng tôi cũng có một số tài liệu dựa trên đó và chỉ cho bạn cách viết một mô-đun tùy chỉnh bằng Python

Một đối tượng trong Python có các thuộc tính (như thuộc tính của nó) và các phương thức (những thứ nó có thể làm). Các thuộc tính quan trọng đối với loại ô tô của chúng tôi là mức nhiên liệu hiện tại và hiệu quả (lượng nhiên liệu tiêu thụ trên mỗi km). Chúng được định nghĩa trong __init__(). Ô tô cũng có thể có một số hành động liên quan đến chúng, chẳng hạn như lái xe một khoảng cách nhất định. Đây là các phương thức lớp, được viết dưới dạng các hàm trong lớp

Lớp sau đây cho phép bạn lái ô tô một quãng đường nhất định với mức nhiên liệu và hiệu quả của nó

class Car:
    def __init__(self, efficiency, fuel_level):
        self.efficiency = efficiency
        self.fuel_level = fuel_level
    
    def drive(self, distance):
        max_distance = self.fuel_level * self.efficiency
        
        if distance > max_distance:
            print('Traveled %s km, out of fuel'%(max_distance))
            self.fuel_level = 0
        else:
            self.fuel_level -= distance / self.efficiency
            print('Arrived safely!')

Chúng ta có thể tạo một đối tượng ô tô với hiệu suất 5 km/L và mức nhiên liệu 12 L như sau

fast_car1 = Car(5, 12)

Hãy lái xe trong 8 km, sau đó kiểm tra mức nhiên liệu

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4

Càng xa càng tốt. Bây giờ chúng tôi muốn sắp xếp lại đối tượng fast_car1 để chúng tôi có thể quay lại và sử dụng nó sau mà không cần phải khởi tạo lại nó. Nhập

fast_car1 = Car(5, 12)
0

dưa chua

Mô-đun Python

fast_car1 = Car(5, 12)
0 là một mô-đun dễ sử dụng để tuần tự hóa (chọn) và giải tuần tự hóa (bỏ chọn) các đối tượng trong Python. Một số lượng lớn các đối tượng có thể được chọn, bao gồm Booleans, số nguyên, số float và chuỗi, cũng như các cấu trúc dữ liệu như danh sách, từ điển, bộ, v.v. Các hàm và lớp có thể được tuần tự hóa, và như chúng ta sẽ thấy bên dưới, các thể hiện của lớp cũng vậy.

Mô-đun Python

fast_car1 = Car(5, 12)
0 lưu trữ dữ liệu ở dạng nhị phân, do đó con người không thể đọc được. Nó đi kèm với bốn phương pháp. Hai cái chúng tôi sẽ sử dụng cho trường hợp của chúng tôi là
fast_car1 = Car(5, 12)
3 và
fast_car1 = Car(5, 12)
4, lần lượt lưu và tải các tệp dưa chua. Hai phương pháp khác là
fast_car1 = Car(5, 12)
5 và
fast_car1 = Car(5, 12)
6, sẽ sắp xếp các đối tượng mà không lưu chúng vào tệp

Chúng ta sẽ xem xét kỹ hơn hai cái đầu tiên bên dưới. Nhưng trước khi chúng tôi làm, một lời cảnh báo. như đã nêu trong tài liệu chính thức, mô-đun

fast_car1 = Car(5, 12)
0 của Python không an toàn trước dữ liệu được xây dựng độc hại có thể thực thi mã nước ngoài. Do đó, không bao giờ giải nén dữ liệu nhận được từ một nguồn không đáng tin cậy

Sau khi tóm tắt về an toàn, chúng ta hãy tiếp tục với một ví dụ về pickling và unpickling trong Python

with open('fast_car_object.pkl', 'wb') as out_file:
    pickle.dump(fast_car1, out_file)

Thực thi mã này sẽ tạo tệp

fast_car1 = Car(5, 12)
8 trong thư mục làm việc hiện tại của bạn. Để giải nén tệp này, chỉ cần làm như sau

with open('fast_car_object.pkl', 'rb') as in_file:
    fast_car2 = pickle.load(in_file)

Lưu ý các chế độ khác nhau mà chúng tôi sử dụng để tuần tự hóa ('

fast_car1 = Car(5, 12)
9') và giải tuần tự hóa ('
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
0'). Hai đối tượng fast_car1
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
2 là hai đối tượng riêng biệt với các vị trí khác nhau trong bộ nhớ; . Nhân tiện, nếu bạn chưa quen với việc sử dụng câu lệnh
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
3 để lưu tệp, thì đây là một số tài liệu về ghi vào tệp bằng Python

Chúng tôi đã đề cập hầu hết mọi thứ trong Python là một đối tượng. Danh sách là một đối tượng, có các thuộc tính và phương thức. Ví dụ:

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
4 là một cách dễ dàng để thêm dữ liệu tùy ý vào danh sách và
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
5 đảo ngược các phần tử. Còn nhiều điều nữa bạn nên làm quen. Bây giờ, hãy thử sắp xếp theo thứ tự một danh sách với
fast_car1 = Car(5, 12)
0 như chúng tôi đã làm ở trên. Hoặc tốt hơn, hãy thử với từ điển. Cấu trúc dữ liệu lồng nhau sẽ hơi cồng kềnh khi lưu vào tệp CSV hoặc tệp văn bản, nhưng đó là cấu trúc hai chiều với mô-đun
fast_car1 = Car(5, 12)
0

Tuần tự hóa JSON trong Python

JSON là viết tắt của JavaScript Object Notation và là một định dạng nhẹ để lưu trữ dữ liệu. Dữ liệu được lưu trữ ở định dạng này có cấu trúc tương tự như từ điển Python, vì vậy nó trông không quá xa lạ. Nếu bạn chưa quen làm việc với các tệp JSON, hãy xem khóa học này. Nó chứa các bài tập tương tác và dạy cho bạn tất cả những gì bạn cần biết

Python có một mô-đun,

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8, rất hữu ích nếu bạn đang tìm cách mã hóa hoặc giải mã dữ liệu ở định dạng này. Lý do để chọn phương pháp này thay vì mô-đun
fast_car1 = Car(5, 12)
0 bao gồm việc nó được tiêu chuẩn hóa và không phụ thuộc vào ngôn ngữ. Nó cũng an toàn hơn nhiều và con người có thể đọc được

Mô-đun

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8 có thể được sử dụng để tuần tự hóa các đối tượng trong Python. Nó thực hiện bốn phương thức cơ bản giống như chúng ta đã thấy ở trên. Kiểm tra tài liệu để biết thêm thông tin và nhiều ví dụ khác

Hãy bắt đầu với một ví dụ đơn giản về tuần tự hóa một danh sách với mô-đun

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8. Ở đây, chúng tôi sử dụng phương pháp
fast_car1 = Car(5, 12)
5, phương thức này không lưu dữ liệu vào tệp mà thay vào đó tuần tự hóa nó thành một chuỗi

	>>> import json
	>>> lst = [1, 2, 3, 'a', 'b', 'c']
	>>> lst_dump = json.dumps(lst)
	>>> lst_dump
	'[1, 2, 3, "a", "b", "c"]'

Bây giờ, nếu chúng ta cố gắng tương tự để tuần tự hóa đối tượng fast_car1 mà chúng ta đã khởi tạo ở trên, chúng ta sẽ gặp sự cố

>>> car_dump = json.dumps(fast_car1)
TypeError: Object of type Car is not JSON serializable

Bộ mã hóa JSON được triển khai trong các phương thức

fast_car1 = Car(5, 12)
3 và
fast_car1 = Car(5, 12)
5 chỉ có thể tuần tự hóa một số loại đối tượng cơ bản. Đây là từ điển, danh sách, chuỗi, số nguyên, số float, Booleans và Không. Các đối tượng phức tạp như fast_car1 cần được tuần tự hóa tùy chỉnh thành định dạng JSON bằng cách xây dựng bộ mã hóa tùy chỉnh trong Python

Viết một bộ mã hóa tùy chỉnh

Con đường phía trước về cơ bản tóm tắt là biểu diễn dữ liệu trong từ điển

>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8 có thể tuần tự hóa. Bạn tạo một lớp bộ mã hóa tùy chỉnh mở rộng lớp
with open('fast_car_object.pkl', 'wb') as out_file:
    pickle.dump(fast_car1, out_file)
8 trong mô-đun
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8, sau đó sử dụng các phương thức
fast_car1 = Car(5, 12)
3 hoặc
fast_car1 = Car(5, 12)
5 bình thường

Hãy xem xét kỹ hơn một ví dụ. Ở đây, lớp Car giống như trên, và bây giờ có một lớp mới,

with open('fast_car_object.pkl', 'rb') as in_file:
    fast_car2 = pickle.load(in_file)
2

from json import JSONEncoder

class Car:
    def __init__(self, efficiency, fuel_level):
        self.efficiency = efficiency
        self.fuel_level = fuel_level

    def drive(self, distance):
        max_distance = self.fuel_level * self.efficiency
        
        if distance > max_distance:
            print('Traveled %s km, out of fuel'%(max_distance))
            self.fuel_level = 0
        else:
            self.fuel_level -= distance / self.efficiency
            print('Arrived safely!')

class CarJSONEncoder(JSONEncoder):
    def default(self, obj):
        return obj.__dict__
Then to JSON serialize our object, we do the following:
>>> fast_car1_json = json.dumps(fast_car1, cls=CarJSONEncoder)
>>> fast_car1_json
'{"efficiency": 5, "fuel_level": 10.4}'

Lớp tùy chỉnh của chúng tôi sử dụng

with open('fast_car_object.pkl', 'rb') as in_file:
    fast_car2 = pickle.load(in_file)
3, đây là thuộc tính tích hợp lưu trữ các thuộc tính của đối tượng dưới dạng cặp khóa/giá trị. Sau đó, chúng tôi chỉ định lớp tùy chỉnh của mình với đối số từ khóa
with open('fast_car_object.pkl', 'rb') as in_file:
    fast_car2 = pickle.load(in_file)
4 trong phương thức
fast_car1 = Car(5, 12)
5. Đầu ra cho thấy đối tượng fast_car1 của chúng tôi thực sự đã được tuần tự hóa JSON

Tốt nhất của cả hai thế giới

Cho đến nay, chúng ta đã khám phá hai phương pháp để tuần tự hóa các đối tượng trong Python. đầu tiên với mô-đun

fast_car1 = Car(5, 12)
0 và thứ hai bằng cách tuần tự hóa thành JSON với mô-đun
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8 và một lớp bộ mã hóa tùy chỉnh.
fast_car1 = Car(5, 12)
0 rất thân thiện với người dùng nhưng con người không thể đọc được và không an toàn.
>>> fast_car1.drive(8)
>>> fast_car1.fuel_level
10.4
8 thì ngược lại

Công việc khó khăn là kết hợp những gì tốt nhất của hai phương pháp này đã được thực hiện cho chúng tôi và có sẵn trong mô-đun

	>>> import json
	>>> lst = [1, 2, 3, 'a', 'b', 'c']
	>>> lst_dump = json.dumps(lst)
	>>> lst_dump
	'[1, 2, 3, "a", "b", "c"]'
1 được đặt tên khéo léo. Mô-đun này cung cấp một bộ công cụ để tuần tự hóa các đối tượng Python phức tạp thành JSON và cũng xử lý việc giải tuần tự hóa.
	>>> import json
	>>> lst = [1, 2, 3, 'a', 'b', 'c']
	>>> lst_dump = json.dumps(lst)
	>>> lst_dump
	'[1, 2, 3, "a", "b", "c"]'
1 xây dựng dựa trên các loại đối tượng cơ bản có thể tuần tự hóa JSON và cho phép các đối tượng phức tạp hơn được tuần tự hóa

Cách dễ nhất để bạn chạm tay vào mô-đun này là bằng một lệnh nhanh chóng

	>>> import json
	>>> lst = [1, 2, 3, 'a', 'b', 'c']
	>>> lst_dump = json.dumps(lst)
	>>> lst_dump
	'[1, 2, 3, "a", "b", "c"]'
3. Mô-đun này đi kèm với cùng một nhãn cảnh báo đi kèm với
fast_car1 = Car(5, 12)
0. Không sử dụng nó để giải tuần tự hóa dữ liệu từ một nguồn không đáng tin cậy

Chức năng của nó tương tự như những gì chúng ta đã thấy trong bài viết này, vì vậy chúng ta sẽ không đi sâu vào chi tiết ở đây. Không cần phải nói, nó đi kèm với phương pháp

	>>> import json
	>>> lst = [1, 2, 3, 'a', 'b', 'c']
	>>> lst_dump = json.dumps(lst)
	>>> lst_dump
	'[1, 2, 3, "a", "b", "c"]'
5 để tuần tự hóa và giải mã() để giải tuần tự hóa. Nó cũng có khả năng tùy biến cao. Kiểm tra tài liệu nếu bạn muốn biết thêm chi tiết và một số ví dụ nhanh

Tuần tự hóa đối tượng chính trong Python

Chúng tôi hy vọng chúng tôi đã làm sáng tỏ tuần tự hóa đối tượng trong Python là gì. Chúng tôi đã chỉ cho bạn một số công cụ hữu ích để giúp bạn quản lý tốt hơn các chương trình và dữ liệu của mình. Hãy chắc chắn rằng bạn đã nhúng tay vào và chơi xung quanh với các ví dụ được hiển thị ở đây. Sau đó, bạn sẽ nhanh chóng thành thạo một khía cạnh khác của Python

Phương pháp __ str __ dùng để làm gì?

Phương thức __str__() trả về một biểu diễn chuỗi mà con người có thể đọc được hoặc không chính thức của một đối tượng . Phương thức này được gọi bởi các hàm print() , str() và format() tích hợp sẵn.

Cách tốt nhất để lưu các đối tượng trong Python là gì?

1. Sử dụng Pickle để lưu trữ các đối tượng Python . Nếu chúng ta muốn mọi thứ đơn giản, chúng ta có thể sử dụng mô-đun pickle, đây là một phần của thư viện chuẩn để lưu dữ liệu trong Python. Chúng ta có thể “chọn” các đối tượng Python vào một tệp pickle mà chúng ta có thể sử dụng để lưu/tải dữ liệu.