Python hướng đối tượng - Tuần tự hóa đối tượng
Trong bối cảnh lưu trữ dữ liệu, tuần tự hóa là quá trình dịch cấu trúc dữ liệu hoặc trạng thái đối tượng sang một định dạng có thể được lưu trữ (ví dụ, trong tệp hoặc bộ đệm bộ nhớ) hoặc truyền và tái tạo sau này.
Trong tuần tự hóa, một đối tượng được chuyển đổi thành một định dạng có thể được lưu trữ, để có thể giải mã hóa nó sau này và tạo lại đối tượng ban đầu từ định dạng được tuần tự hóa.
Dưa chua
Pickling là quá trình theo đó một hệ thống phân cấp đối tượng Python được chuyển đổi thành một luồng byte (thường con người không thể đọc được) để ghi vào một tệp, đây còn được gọi là Serialization. Bỏ chọn là hoạt động ngược lại, theo đó một luồng byte được chuyển đổi trở lại thành một hệ thống phân cấp đối tượng Python đang hoạt động.
Pickle là cách đơn giản nhất để lưu trữ đối tượng. Mô-đun Python Pickle là một cách hướng đối tượng để lưu trữ các đối tượng trực tiếp trong một định dạng lưu trữ đặc biệt.
Nó có thể làm gì?
- Pickle có thể lưu trữ và tái tạo từ điển và danh sách rất dễ dàng.
- Lưu trữ các thuộc tính đối tượng và khôi phục chúng trở lại trạng thái cũ.
Những gì dưa muối không làm được?
- Nó không lưu mã đối tượng. Chỉ các giá trị thuộc tính của nó.
- Nó không thể lưu trữ các tay cầm tập tin hoặc ổ cắm kết nối.
Tóm lại, chúng ta có thể nói, pickling là một cách để lưu trữ và truy xuất các biến dữ liệu vào và ra từ các tệp mà các biến có thể là danh sách, lớp, v.v.
Để chọn thứ gì đó bạn phải -
- nhập khẩu dưa chua
- Ghi một biến vào tệp, giống như
pickle.dump(mystring, outfile, protocol),
trong đó giao thức đối số thứ 3 là tùy chọn Để bỏ chọn thứ gì đó, bạn phải -
Nhập dưa chua
Ghi một biến vào một tệp, giống như
myString = pickle.load(inputfile)
Phương pháp
Giao diện dưa chua cung cấp bốn phương pháp khác nhau.
dump() - Phương thức dump () tuần tự hóa thành một tệp đang mở (đối tượng giống tệp).
dumps() - Nối tiếp thành một chuỗi
load() - Hủy phiên bản từ một đối tượng giống như mở.
loads() - Hủy phiên bản từ một chuỗi.
Dựa trên quy trình trên, dưới đây là một ví dụ về "ngâm".
Đầu ra
My Cat pussy is White and has 4 legs
Would you like to see her pickled? Here she is!
b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x0e\x00\x00\x00number_of_legsq\x03K\x04X\x05\x00\x00\x00colorq\x04X\x05\x00\x00\x00Whiteq\x05ub.'
Vì vậy, trong ví dụ trên, chúng ta đã tạo một thể hiện của một lớp Cat và sau đó chúng ta đã chọn nó, biến thể hiện “Cat” của chúng ta thành một mảng byte đơn giản.
Bằng cách này, chúng tôi có thể dễ dàng lưu trữ mảng byte trên tệp nhị phân hoặc trong trường cơ sở dữ liệu và khôi phục nó về dạng ban đầu từ hỗ trợ lưu trữ của chúng tôi trong thời gian sau.
Ngoài ra, nếu bạn muốn tạo một tệp có đối tượng được ngâm, bạn có thể sử dụng phương thức dump () (thay vì kết xuất * () * one) chuyển cũng một tệp nhị phân đã mở và kết quả ngâm sẽ được lưu trữ tự động trong tệp.
[….]
binary_file = open(my_pickled_Pussy.bin', mode='wb')
my_pickled_Pussy = pickle.dump(Pussy, binary_file)
binary_file.close()
Bỏ chọn
Quá trình lấy một mảng nhị phân và chuyển đổi nó thành một hệ thống phân cấp đối tượng được gọi là giải nén.
Quá trình giải nén được thực hiện bằng cách sử dụng hàm load () của mô-đun pickle và trả về một hệ thống phân cấp đối tượng hoàn chỉnh từ một mảng byte đơn giản.
Hãy sử dụng hàm tải trong ví dụ trước của chúng tôi.
Đầu ra
MeOw is black
Pussy is white
JSON
JSON (JavaScript Object Notation) là một phần của thư viện chuẩn Python, là một định dạng trao đổi dữ liệu nhẹ. Con người dễ đọc và viết. Nó rất dễ dàng để phân tích cú pháp và tạo.
Vì tính đơn giản của nó, JSON là một cách mà chúng ta lưu trữ và trao đổi dữ liệu, được thực hiện thông qua cú pháp JSON và được sử dụng trong nhiều ứng dụng web. Vì nó ở định dạng con người có thể đọc được và đây có thể là một trong những lý do để sử dụng nó trong việc truyền dữ liệu, bên cạnh tính hiệu quả của nó khi làm việc với các API.
Ví dụ về dữ liệu có định dạng JSON như sau:
{"EmployID": 40203, "Name": "Zack", "Age":54, "isEmployed": True}
Python làm cho nó đơn giản để làm việc với các tệp Json. Mô-đun bị treo cho mục đích này là mô-đun JSON. Mô-đun này nên được bao gồm (tích hợp sẵn) trong cài đặt Python của bạn.
Vì vậy, hãy xem làm thế nào chúng ta có thể chuyển đổi từ điển Python sang JSON và ghi nó vào một tệp văn bản.
JSON sang Python
Đọc JSON có nghĩa là chuyển đổi JSON thành một giá trị Python (đối tượng). Thư viện json phân tích cú pháp JSON thành một từ điển hoặc danh sách bằng Python. Để làm điều đó, chúng tôi sử dụng hàm load () (tải từ một chuỗi), như sau:
Đầu ra
Dưới đây là một tệp json mẫu,
data1.json
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Nội dung trên (Data1.json) trông giống như một từ điển thông thường. Chúng tôi có thể sử dụng pickle để lưu trữ tệp này nhưng đầu ra của nó không phải là dạng con người có thể đọc được.
JSON (Thông báo đối tượng tập lệnh Java) là một định dạng rất đơn giản và đó là một trong những lý do phổ biến của nó. Bây giờ chúng ta hãy xem xét đầu ra json thông qua chương trình dưới đây.
Đầu ra
Ở trên, chúng ta mở tệp json (data1.json) để đọc, lấy trình xử lý tệp và chuyển cho json.load và lấy lại đối tượng. Khi chúng tôi cố gắng in đầu ra của đối tượng, nó giống như tệp json. Mặc dù kiểu của đối tượng là từ điển, nhưng nó xuất hiện dưới dạng một đối tượng Python. Viết thư cho json rất đơn giản như chúng ta đã thấy món dưa chua này. Ở trên, chúng tôi tải tệp json, thêm một cặp giá trị khóa khác và ghi nó trở lại cùng tệp json. Bây giờ, nếu chúng ta nhìn thấy data1.json, nó sẽ khác .ie không có cùng định dạng như chúng ta thấy trước đây.
Để làm cho Đầu ra của chúng ta trông giống nhau (định dạng con người có thể đọc được), hãy thêm một vài đối số vào dòng cuối cùng của chương trình,
json.dump(conf, fh, indent = 4, separators = (‘,’, ‘: ‘))
Tương tự như dưa chua, chúng ta có thể in chuỗi với bãi chứa và tải với tải. Dưới đây là một ví dụ về điều đó,
YAML
YAML có thể là tiêu chuẩn tuần tự hóa dữ liệu thân thiện với con người nhất cho tất cả các ngôn ngữ lập trình.
Mô-đun yaml trong Python được gọi là pyaml
YAML là một giải pháp thay thế cho JSON -
Human readable code - YAML là định dạng con người dễ đọc nhất đến nỗi ngay cả nội dung trang đầu của nó cũng được hiển thị trong YAML để làm rõ điều này.
Compact code - Trong YAML, chúng tôi sử dụng thụt lề khoảng trắng để biểu thị cấu trúc không phải dấu ngoặc.
Syntax for relational data - Đối với các tham chiếu nội bộ, chúng tôi sử dụng ký tự neo (&) và bí danh (*).
One of the area where it is used widely is for viewing/editing of data structures - ví dụ các tệp cấu hình, kết xuất trong quá trình gỡ lỗi và tiêu đề tài liệu.
Cài đặt YAML
Vì yaml không phải là một mô-đun tích hợp sẵn, chúng tôi cần cài đặt nó theo cách thủ công. Cách tốt nhất để cài đặt yaml trên máy tính Windows là thông qua pip. Chạy lệnh dưới đây trên thiết bị đầu cuối windows của bạn để cài đặt yaml,
pip install pyaml (Windows machine)
sudo pip install pyaml (*nix and Mac)
Khi chạy lệnh trên, màn hình sẽ hiển thị một cái gì đó như bên dưới dựa trên phiên bản mới nhất hiện tại.
Collecting pyaml
Using cached pyaml-17.12.1-py2.py3-none-any.whl
Collecting PyYAML (from pyaml)
Using cached PyYAML-3.12.tar.gz
Installing collected packages: PyYAML, pyaml
Running setup.py install for PyYAML ... done
Successfully installed PyYAML-3.12 pyaml-17.12.1
Để kiểm tra nó, hãy vào Python shell và import mô-đun yaml, import yaml, nếu không tìm thấy lỗi nào thì có thể nói cài đặt thành công.
Sau khi cài đặt pyaml, hãy xem đoạn mã dưới đây,
script_yaml1.py
Ở trên, chúng tôi đã tạo ba cấu trúc dữ liệu khác nhau, từ điển, danh sách và tuple. Trên mỗi cấu trúc, chúng tôi thực hiện yaml.dump. Điểm quan trọng là cách hiển thị đầu ra trên màn hình.
Đầu ra
Đầu ra từ điển trông sạch sẽ .ie. giá trị cốt lõi.
Khoảng trắng để ngăn cách các đối tượng khác nhau.
Danh sách được ký hiệu bằng dấu gạch ngang (-)
Tuple được chỉ định đầu tiên bằng !! Python / tuple và sau đó ở định dạng giống như danh sách.
Đang tải tệp yaml
Vì vậy, giả sử tôi có một tệp yaml, chứa,
---
# An employee record
name: Raagvendra Joshi
job: Developer
skill: Oracle
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
Oracle: Elite
power_builder: Elite
Full Stack Developer: Lame
education:
4 GCSEs
3 A-Levels
MCA in something called com
Bây giờ chúng ta hãy viết mã để tải tệp yaml này thông qua hàm yaml.load. Dưới đây là mã cho cùng một.
Vì đầu ra trông không dễ đọc như vậy, nên cuối cùng tôi đã xác minh nó bằng cách sử dụng json. So sánh kết quả mà chúng tôi nhận được và tệp yaml thực tế mà chúng tôi có.
Đầu ra
Một trong những khía cạnh quan trọng nhất của phát triển phần mềm là gỡ lỗi. Trong phần này, chúng ta sẽ thấy các cách gỡ lỗi Python khác nhau bằng trình gỡ lỗi tích hợp sẵn hoặc trình gỡ lỗi bên thứ ba.
PDB - Trình gỡ lỗi Python
Mô-đun PDB hỗ trợ thiết lập các điểm ngắt. Điểm ngắt là một khoảng dừng có chủ ý của chương trình, nơi bạn có thể nhận thêm thông tin về trạng thái chương trình.
Để đặt điểm ngắt, hãy chèn dòng
pdb.set_trace()
Thí dụ
pdb_example1.py
import pdb
x = 9
y = 7
pdb.set_trace()
total = x + y
pdb.set_trace()
Chúng tôi đã chèn một vài điểm ngắt trong chương trình này. Chương trình sẽ tạm dừng tại mỗi điểm ngắt (pdb.set_trace ()). Để xem nội dung của một biến, chỉ cần nhập tên biến.
c:\Python\Python361>Python pdb_example1.py
> c:\Python\Python361\pdb_example1.py(8)<module>()
-> total = x + y
(Pdb) x
9
(Pdb) y
7
(Pdb) total
*** NameError: name 'total' is not defined
(Pdb)
Nhấn c hoặc tiếp tục thực hiện chương trình cho đến điểm ngắt tiếp theo.
(Pdb) c
--Return--
> c:\Python\Python361\pdb_example1.py(8)<module>()->None
-> total = x + y
(Pdb) total
16
Cuối cùng, bạn sẽ cần gỡ lỗi các chương trình lớn hơn nhiều - các chương trình sử dụng chương trình con. Và đôi khi, vấn đề mà bạn đang cố gắng tìm kiếm sẽ nằm bên trong một chương trình con. Hãy xem xét chương trình sau đây.
import pdb
def squar(x, y):
out_squared = x^2 + y^2
return out_squared
if __name__ == "__main__":
#pdb.set_trace()
print (squar(4, 5))
Bây giờ đang chạy chương trình trên,
c:\Python\Python361>Python pdb_example2.py
> c:\Python\Python361\pdb_example2.py(10)<module>()
-> print (squar(4, 5))
(Pdb)
Chúng ta có thể sử dụng ?để nhận trợ giúp, nhưng mũi tên chỉ ra dòng sắp được thực thi. Tại thời điểm này, sẽ hữu ích khi nhấns để bước vào dòng đó.
(Pdb) s
--Call--
>c:\Python\Python361\pdb_example2.py(3)squar()
-> def squar(x, y):
Đây là một cuộc gọi đến một hàm. Nếu bạn muốn có một cái nhìn tổng quan về vị trí của bạn trong mã của mình, hãy thử l -
(Pdb) l
1 import pdb
2
3 def squar(x, y):
4 -> out_squared = x^2 + y^2
5
6 return out_squared
7
8 if __name__ == "__main__":
9 pdb.set_trace()
10 print (squar(4, 5))
[EOF]
(Pdb)
Bạn có thể nhấn n để chuyển sang dòng tiếp theo. Tại thời điểm này, bạn đang ở bên trong phương thức out_squared và bạn có quyền truy cập vào biến được khai báo bên trong hàm .ie x và y.
(Pdb) x
4
(Pdb) y
5
(Pdb) x^2
6
(Pdb) y^2
7
(Pdb) x**2
16
(Pdb) y**2
25
(Pdb)
Vì vậy, chúng ta có thể thấy toán tử ^ không phải là những gì chúng ta muốn thay vào đó chúng ta cần sử dụng toán tử ** để tạo các ô vuông.
Bằng cách này, chúng ta có thể gỡ lỗi chương trình của mình bên trong các hàm / phương thức.
Ghi nhật ký
Mô-đun ghi nhật ký đã là một phần của Thư viện tiêu chuẩn của Python kể từ phiên bản Python 2.3. Vì là mô-đun tích hợp nên tất cả mô-đun Python đều có thể tham gia ghi nhật ký, để nhật ký ứng dụng của chúng tôi có thể bao gồm thông báo của riêng bạn được tích hợp với thông báo từ mô-đun của bên thứ ba. Nó cung cấp rất nhiều tính linh hoạt và chức năng.
Lợi ích của việc ghi nhật ký
Diagnostic logging - Nó ghi lại các sự kiện liên quan đến hoạt động của ứng dụng.
Audit logging - Nó ghi lại các sự kiện để phân tích kinh doanh.
Tin nhắn được viết và ghi ở mức độ “nghiêm trọng” & minu
DEBUG (debug()) - thông báo chẩn đoán để phát triển.
INFO (info()) - thông báo "tiến độ" tiêu chuẩn.
WARNING (warning()) - đã phát hiện một vấn đề không nghiêm trọng.
ERROR (error()) - gặp lỗi, có thể nghiêm trọng.
CRITICAL (critical()) - thường là lỗi nghiêm trọng (chương trình dừng).
Hãy xem xét chương trình đơn giản dưới đây,
import logging
logging.basicConfig(level=logging.INFO)
logging.debug('this message will be ignored') # This will not print
logging.info('This should be logged') # it'll print
logging.warning('And this, too') # It'll print
Ở trên, chúng tôi đang ghi nhật ký các thông báo về mức độ nghiêm trọng. Đầu tiên, chúng tôi nhập mô-đun, gọi basicConfig và đặt mức ghi nhật ký. Mức chúng tôi đặt ở trên là THÔNG TIN. Sau đó, chúng tôi có ba tuyên bố khác nhau: tuyên bố gỡ lỗi, tuyên bố thông tin và tuyên bố cảnh báo.
Đầu ra của logging1.py
INFO:root:This should be logged
WARNING:root:And this, too
Vì câu lệnh thông tin bên dưới câu lệnh gỡ lỗi, chúng tôi không thể thấy thông báo gỡ lỗi. Để nhận được câu lệnh gỡ lỗi trong đầu cuối Output, tất cả những gì chúng ta cần thay đổi là mức basicConfig.
logging.basicConfig(level = logging.DEBUG)
Và trong Đầu ra, chúng ta có thể thấy,
DEBUG:root:this message will be ignored
INFO:root:This should be logged
WARNING:root:And this, too
Ngoài ra, hành vi mặc định có nghĩa là nếu chúng tôi không đặt bất kỳ mức ghi nhật ký nào là cảnh báo. Chỉ cần nhận xét dòng thứ hai từ chương trình trên và chạy mã.
#logging.basicConfig(level = logging.DEBUG)
Đầu ra
WARNING:root:And this, too
Python được xây dựng trong cấp độ ghi nhật ký thực sự là các số nguyên.
>>> import logging
>>>
>>> logging.DEBUG
10
>>> logging.CRITICAL
50
>>> logging.WARNING
30
>>> logging.INFO
20
>>> logging.ERROR
40
>>>
Chúng tôi cũng có thể lưu các thông báo nhật ký vào tệp.
logging.basicConfig(level = logging.DEBUG, filename = 'logging.log')
Bây giờ tất cả các thông báo nhật ký sẽ chuyển sang tệp (logging.log) trong thư mục làm việc hiện tại của bạn thay vì màn hình. Đây là một cách tiếp cận tốt hơn nhiều vì nó cho phép chúng tôi thực hiện phân tích bài đăng về các thông điệp chúng tôi nhận được.
Chúng tôi cũng có thể đặt dấu ngày tháng với thông báo nhật ký của chúng tôi.
logging.basicConfig(level=logging.DEBUG, format = '%(asctime)s %(levelname)s:%(message)s')
Đầu ra sẽ nhận được một cái gì đó như,
2018-03-08 19:30:00,066 DEBUG:this message will be ignored
2018-03-08 19:30:00,176 INFO:This should be logged
2018-03-08 19:30:00,201 WARNING:And this, too
Đo điểm chuẩn
Đo điểm chuẩn hoặc lập hồ sơ về cơ bản là để kiểm tra tốc độ thực thi mã của bạn và các điểm nghẽn ở đâu? Lý do chính để làm điều này là để tối ưu hóa.
thời gian
Python đi kèm với một mô-đun tích hợp được gọi là timeit. Bạn có thể sử dụng nó để bấm giờ cho các đoạn mã nhỏ. Mô-đun thời gian sử dụng các chức năng thời gian dành riêng cho nền tảng để bạn có được thời gian chính xác nhất có thể.
Vì vậy, nó cho phép chúng tôi so sánh hai lô hàng mã được lấy bởi mỗi người và sau đó tối ưu hóa các tập lệnh để có hiệu suất tốt hơn.
Mô-đun thời gian có giao diện dòng lệnh, nhưng nó cũng có thể được nhập.
Có hai cách để gọi một script. Trước tiên, hãy sử dụng tập lệnh, chạy đoạn mã dưới đây và xem Đầu ra.
import timeit
print ( 'by index: ', timeit.timeit(stmt = "mydict['c']", setup = "mydict = {'a':5, 'b':10, 'c':15}", number = 1000000))
print ( 'by get: ', timeit.timeit(stmt = 'mydict.get("c")', setup = 'mydict = {"a":5, "b":10, "c":15}', number = 1000000))
Đầu ra
by index: 0.1809192126703489
by get: 0.6088525265034692
Ở trên, chúng tôi sử dụng hai phương thức khác nhau .ie by subscript và truy cập giá trị khóa từ điển. Chúng tôi thực thi câu lệnh 1 triệu lần vì nó thực thi quá nhanh đối với một dữ liệu rất nhỏ. Bây giờ chúng ta có thể thấy truy cập chỉ mục nhanh hơn nhiều so với nhận được. Chúng ta có thể chạy mã nhân lên nhiều lần và sẽ có một chút thay đổi trong thời gian thực thi để hiểu rõ hơn.
Một cách khác là chạy thử nghiệm trên trong dòng lệnh. Hãy làm nó,
c:\Python\Python361>Python -m timeit -n 1000000 -s "mydict = {'a': 5, 'b':10, 'c':15}" "mydict['c']"
1000000 loops, best of 3: 0.187 usec per loop
c:\Python\Python361>Python -m timeit -n 1000000 -s "mydict = {'a': 5, 'b':10, 'c':15}" "mydict.get('c')"
1000000 loops, best of 3: 0.659 usec per loop
Đầu ra trên có thể thay đổi tùy theo phần cứng hệ thống của bạn và tất cả các ứng dụng hiện đang chạy trong hệ thống của bạn.
Dưới đây, chúng ta có thể sử dụng mô-đun timeit, nếu chúng ta muốn gọi một hàm. Vì chúng ta có thể thêm nhiều câu lệnh bên trong hàm để kiểm tra.
import timeit
def testme(this_dict, key):
return this_dict[key]
print (timeit.timeit("testme(mydict, key)", setup = "from __main__ import testme; mydict = {'a':9, 'b':18, 'c':27}; key = 'c'", number = 1000000))
Đầu ra
0.7713474590139164