Ghi đè __dict__ python

Tạo các lớp giống như từ điển có thể là một yêu cầu trong sự nghiệp Python của bạn. Cụ thể, bạn có thể quan tâm đến việc tạo từ điển tùy chỉnh với hành vi được sửa đổi, chức năng mới hoặc cả hai. Trong Python, bạn có thể làm điều này bằng cách kế thừa từ một lớp , bằng cách phân lớp trực tiếp lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp sẵn hoặc bằng cách kế thừa từ

Trong hướng dẫn này, bạn sẽ học cách

  • Tạo các lớp giống như từ điển bằng cách kế thừa từ lớp
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    7 tích hợp
  • Xác định những cạm bẫy phổ biến có thể xảy ra khi thừa kế từ
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    7
  • Xây dựng các lớp giống như từ điển bằng cách phân lớp
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    8 từ mô-đun
    >>> numbers = UpperCaseDict()
    >>> numbers["one"] = 1
    >>> numbers["two"] = 2
    >>> numbers["three"] = 3
    
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3}
    
    >>> numbers.update({"four": 4})
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}
    
    >>> numbers.setdefault("five", 5)
    5
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
    
    2

Ngoài ra, bạn sẽ viết mã một vài ví dụ giúp bạn hiểu những ưu và nhược điểm của việc sử dụng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 so với
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 để tạo các lớp từ điển tùy chỉnh của bạn

Để tận dụng tối đa hướng dẫn này, bạn nên làm quen với lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp sẵn của Python cũng như các tính năng và chức năng tiêu chuẩn của nó. Bạn cũng sẽ cần biết kiến ​​thức cơ bản về lập trình hướng đối tượng và hiểu cách hoạt động của tính kế thừa trong Python

Tham gia ngay. Nhấp vào đây để tham gia Bản tin Python thực sự và bạn sẽ không bao giờ bỏ lỡ một bài hướng dẫn, cập nhật khóa học hoặc bài đăng nào khác về Python

Tạo các lớp giống như từ điển trong Python

Lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp cung cấp kiểu dữ liệu sưu tập có giá trị và linh hoạt, từ điển Python. Từ điển ở khắp mọi nơi, kể cả trong mã của bạn và mã của chính Python

Đôi khi, chức năng tiêu chuẩn của từ điển Python không đủ cho một số trường hợp sử dụng nhất định. Trong những tình huống này, có lẽ bạn sẽ phải tạo một lớp giống như từ điển tùy chỉnh. Nói cách khác, bạn cần một lớp hoạt động giống như một từ điển thông thường nhưng có chức năng mới hoặc được sửa đổi

Thông thường, bạn sẽ tìm thấy ít nhất hai lý do để tạo các lớp giống như từ điển tùy chỉnh

  1. Mở rộng từ điển thông thường bằng cách thêm chức năng mới
  2. Sửa đổi chức năng của từ điển tiêu chuẩn

Lưu ý rằng bạn cũng có thể đối mặt với các tình huống trong đó bạn cần mở rộng và sửa đổi chức năng tiêu chuẩn của từ điển

Tùy thuộc vào nhu cầu cụ thể và trình độ kỹ năng của bạn, bạn có thể chọn từ một số chiến lược để tạo từ điển tùy chỉnh. Bạn có thể

  • Kế thừa từ một lớp cơ sở trừu tượng thích hợp, chẳng hạn như
  • Kế thừa trực tiếp từ lớp tích hợp Python
  • Phân lớp từ
    >>> numbers = UpperCaseDict()
    >>> numbers["one"] = 1
    >>> numbers["two"] = 2
    >>> numbers["three"] = 3
    
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3}
    
    >>> numbers.update({"four": 4})
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}
    
    >>> numbers.setdefault("five", 5)
    5
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
    
    2

Có một số cân nhắc chính khi bạn chọn chiến lược phù hợp để triển khai. Tiếp tục đọc để biết thêm chi tiết

Loại bỏ các quảng cáo

Xây dựng một lớp giống như từ điển từ một lớp cơ sở trừu tượng

Chiến lược tạo các lớp giống như từ điển này yêu cầu bạn kế thừa từ một lớp cơ sở trừu tượng (ABC), như. Lớp này cung cấp các triển khai chung cụ thể của tất cả các phương thức từ điển ngoại trừ , , , và , mà bạn sẽ phải tự triển khai

Ngoài ra, giả sử bạn cần tùy chỉnh chức năng của bất kỳ phương thức từ điển tiêu chuẩn nào khác. Trong trường hợp đó, bạn sẽ phải ghi đè phương thức hiện có và cung cấp cách triển khai phù hợp đáp ứng nhu cầu của bạn

Quá trình này ngụ ý một lượng công việc hợp lý. Nó cũng dễ bị lỗi và yêu cầu kiến ​​thức nâng cao về Python và mô hình dữ liệu của nó. Nó cũng có thể ngụ ý các vấn đề về hiệu suất vì bạn sẽ viết lớp bằng Python thuần túy

Ưu điểm chính của chiến lược này là ABC gốc sẽ cảnh báo bạn nếu bạn bỏ lỡ bất kỳ phương pháp nào trong quá trình triển khai tùy chỉnh của mình

Vì những lý do này, bạn chỉ nên áp dụng chiến lược này nếu bạn cần một lớp giống như từ điển về cơ bản khác với từ điển tích hợp

Trong hướng dẫn này, bạn sẽ tập trung vào việc tạo các lớp giống như từ điển bằng cách kế thừa từ lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 và lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 có sẵn, đây dường như là những chiến lược nhanh nhất và thiết thực nhất

Kế thừa từ lớp >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3}) >>> numbers {'one': 1, 'two': 2, 'three': 3} 7 tích hợp sẵn của Python

Trong một thời gian dài, không thể phân lớp Python được triển khai trong C. Trăn 2. 2 đã khắc phục sự cố này. Bây giờ bạn có thể , bao gồm cả

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7. Sự thay đổi này mang lại một số lợi thế kỹ thuật cho các lớp con bởi vì bây giờ chúng

  • Sẽ hoạt động ở mọi nơi yêu cầu loại tích hợp ban đầu
  • Có thể định nghĩa các phương thức , , và mới
  • Có thể lưu trữ chúng trong một thuộc tính lớp, về cơ bản thay thế thuộc tính

Mục đầu tiên trong danh sách này có thể là một yêu cầu đối với mã C mong đợi một lớp tích hợp Python. Mục thứ hai cho phép bạn thêm chức năng mới vào đầu hành vi từ điển tiêu chuẩn. Cuối cùng, mục thứ ba sẽ cho phép bạn hạn chế các thuộc tính của một lớp con chỉ với những thuộc tính được xác định trước trong

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
41

Mặc dù việc phân lớp các loại tích hợp sẵn có một số ưu điểm, nhưng nó cũng có một số nhược điểm. Trong trường hợp cụ thể của từ điển, bạn sẽ tìm thấy một vài cạm bẫy khó chịu. Ví dụ: giả sử bạn muốn tạo một lớp giống như từ điển tự động lưu trữ tất cả các khóa của nó dưới dạng chuỗi trong đó tất cả các chữ cái, nếu có, là chữ hoa

Để làm điều này, bạn có thể tạo một lớp con của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 ghi đè phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7

Mát mẻ. Từ điển tùy chỉnh của bạn dường như hoạt động tốt. Tuy nhiên, có một số vấn đề tiềm ẩn trong lớp này. Nếu bạn cố gắng tạo một phiên bản của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
46 bằng cách sử dụng một số dữ liệu khởi tạo, thì bạn sẽ nhận được một hành vi đáng ngạc nhiên và có lỗi

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}

Điều gì vừa xảy ra? . Vì vậy, chuyển đổi chữ hoa không bao giờ chạy

Thật không may, sự cố này ảnh hưởng đến các phương pháp từ điển khác, chẳng hạn như và ,

>>>

>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}

Một lần nữa, chức năng viết hoa của bạn không hoạt động tốt trong các ví dụ này. Để giải quyết vấn đề này, bạn phải cung cấp triển khai tùy chỉnh của tất cả các phương pháp bị ảnh hưởng. Ví dụ: để khắc phục sự cố khởi tạo, bạn có thể viết một phương thức

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47 giống như thế này

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
6

Ở đây,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47 chuyển đổi các phím thành chữ hoa và sau đó khởi tạo phiên bản hiện tại với dữ liệu kết quả

Với bản cập nhật này, quá trình khởi tạo từ điển tùy chỉnh của bạn sẽ hoạt động bình thường. Hãy tiếp tục và thử bằng cách chạy đoạn mã sau

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
4

Cung cấp phương thức

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47 của riêng bạn đã khắc phục sự cố khởi tạo. Tuy nhiên, các phương pháp khác như
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 tiếp tục hoạt động không chính xác, vì bạn có thể kết luận từ khóa
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
95 không phải là chữ hoa

Tại sao các lớp con

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 hành xử theo cách này? . Do đó, chúng có thể mở rộng nhưng không thể sửa đổi. Việc cho phép sửa đổi các tính năng cốt lõi của các lớp này có thể phá vỡ khả năng của chúng. Vì vậy, các nhà phát triển lõi Python đã quyết định bảo vệ chúng khỏi các sửa đổi

Đó là lý do tại sao việc phân lớp lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp có thể hơi phức tạp, tốn nhiều công sức và dễ bị lỗi. May mắn thay, bạn vẫn có lựa chọn thay thế. Lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 từ mô-đun
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
2 là một trong số đó

Loại bỏ các quảng cáo

Phân lớp >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3}) >>> numbers {'one': 1, 'two': 2, 'three': 3} 8 Từ >>> numbers = UpperCaseDict() >>> numbers["one"] = 1 >>> numbers["two"] = 2 >>> numbers["three"] = 3 >>> numbers {'ONE': 1, 'TWO': 2, 'THREE': 3} >>> numbers.update({"four": 4}) >>> numbers {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4} >>> numbers.setdefault("five", 5) 5 >>> numbers {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5} 2

Bắt đầu với Python 1. 6, ngôn ngữ đã cung cấp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 như một phần của thư viện tiêu chuẩn. Lớp này ban đầu nằm trong một mô-đun được đặt tên theo chính lớp đó. Trong Python 3,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 đã được chuyển sang mô-đun
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
2, đây là một nơi trực quan hơn cho nó, dựa trên mục đích chính của lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 được tạo lại khi không thể kế thừa trực tiếp từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 của Python. Mặc dù nhu cầu về lớp này đã được thay thế một phần bằng khả năng phân lớp trực tiếp lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 được tích hợp sẵn, nhưng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 vẫn có sẵn trong thư viện chuẩn, cả về sự thuận tiện và khả năng tương thích ngược

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 là một trình bao bọc thuận tiện xung quanh một đối tượng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 thông thường. Lớp này cung cấp hành vi tương tự như kiểu dữ liệu
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp với tính năng bổ sung cho phép bạn truy cập vào từ điển cơ bản thông qua thuộc tính thể hiện. Tính năng này có thể tạo thuận lợi cho việc tạo các lớp giống như từ điển tùy chỉnh, như bạn sẽ tìm hiểu sau trong hướng dẫn này

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 được thiết kế đặc biệt cho mục đích phân lớp hơn là để khởi tạo trực tiếp, điều đó có nghĩa là mục đích chính của lớp là cho phép bạn tạo các lớp giống như từ điển thông qua kế thừa

Ngoài ra còn có sự khác biệt tiềm ẩn khác. Để khám phá chúng, hãy quay lại triển khai ban đầu của bạn về

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
46 và cập nhật nó như trong mã bên dưới

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
9

Lần này, thay vì kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, bạn đang kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 mà bạn đã nhập từ mô-đun
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
2. Thay đổi này sẽ ảnh hưởng đến hành vi của lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
46 của bạn như thế nào?

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
3

Bây giờ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
46 hoạt động chính xác mọi lúc. Bạn không cần cung cấp triển khai tùy chỉnh của ________ 147, ________ 149 hoặc ________ 290. Lớp học chỉ hoạt động. Điều này là do trong
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, tất cả các phương pháp cập nhật khóa hiện có hoặc thêm khóa mới đều dựa vào phiên bản
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 của bạn

Như bạn đã biết trước đây, sự khác biệt đáng chú ý nhất giữa

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 là thuộc tính
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22, chứa từ điển được bao bọc. Sử dụng trực tiếp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22 có thể làm cho mã của bạn đơn giản hơn vì bạn không cần phải gọi
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 mọi lúc để cung cấp chức năng mong muốn. Bạn chỉ cần truy cập vào
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22 và làm việc với nó như với bất kỳ từ điển thông thường nào

Các lớp giống như từ điển mã hóa. Ví dụ thực tế

Bạn đã biết rằng các lớp con của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 không gọi
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 từ các phương thức như
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47. Thực tế này làm cho các lớp con của
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 hoạt động khác với một lớp Python điển hình với phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63

Để khắc phục sự cố này, bạn có thể kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, vốn gọi
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 từ tất cả các thao tác đặt hoặc cập nhật giá trị trong từ điển cơ bản. Nhờ tính năng này,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 có thể làm cho mã của bạn an toàn hơn và nhỏ gọn hơn

Phải thừa nhận rằng, khi bạn nghĩ đến việc tạo một lớp giống như từ điển, việc kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 sẽ tự nhiên hơn là kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8. Điều này là do tất cả các nhà phát triển Python đều biết về
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, nhưng không phải tất cả các nhà phát triển Python đều biết về sự tồn tại của
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8

Kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 thường ngụ ý một số vấn đề mà bạn có thể khắc phục bằng cách sử dụng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 thay thế. Tuy nhiên, những vấn đề này không phải lúc nào cũng liên quan. Mức độ liên quan của chúng phụ thuộc rất nhiều vào cách bạn muốn tùy chỉnh chức năng của từ điển

Điểm mấu chốt là

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 không phải lúc nào cũng là giải pháp phù hợp. Nói chung, nếu bạn muốn mở rộng từ điển tiêu chuẩn mà không ảnh hưởng đến cấu trúc cốt lõi của nó, thì hoàn toàn có thể kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7. Mặt khác, nếu bạn muốn thay đổi hành vi từ điển cốt lõi bằng cách ghi đè các phương thức đặc biệt của nó, thì
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 là lựa chọn thay thế tốt nhất của bạn

Trong mọi trường hợp, hãy nhớ rằng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 được viết bằng C và được tối ưu hóa cao cho hiệu suất. Trong khi đó,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 được viết bằng Python thuần túy, điều này có thể gây ra một hạn chế đáng kể về mặt hiệu suất

Bạn nên xem xét một số yếu tố khi quyết định nên thừa kế từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 hay
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8. Những yếu tố này bao gồm, nhưng không giới hạn, những điều sau đây

  • Khối lượng công việc
  • Rủi ro lỗi và lỗi
  • Dễ sử dụng và mã hóa
  • Hiệu suất

Trong phần sau, bạn sẽ trải nghiệm ba yếu tố đầu tiên trong danh sách này bằng cách mã hóa một số ví dụ thực tế. Bạn sẽ tìm hiểu về ý nghĩa hiệu suất sau này, trong phần về

Loại bỏ các quảng cáo

Từ điển chấp nhận cách đánh vần các phím của Anh và Mỹ

Như ví dụ đầu tiên, giả sử bạn cần một từ điển lưu trữ các khóa bằng tiếng Anh Mỹ và cho phép tra cứu khóa bằng tiếng Anh Mỹ hoặc Anh. Để viết mã từ điển này, bạn cần sửa đổi ít nhất hai ,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62

Phương pháp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 sẽ cho phép bạn luôn lưu trữ chìa khóa bằng tiếng Anh Mỹ. Phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62 sẽ cho phép truy xuất giá trị được liên kết với một khóa nhất định, cho dù nó được đánh vần bằng tiếng Anh Mỹ hay Anh

Bởi vì bạn cần sửa đổi hành vi cốt lõi của lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, sử dụng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 sẽ là lựa chọn tốt hơn để viết mã lớp này. Với
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, bạn sẽ không phải cung cấp các triển khai tùy chỉnh của
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49, v.v.

Khi bạn phân lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, bạn có hai cách chính để mã hóa lớp của mình. Bạn có thể dựa vào thuộc tính
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22, thuộc tính này có thể tạo điều kiện thuận lợi cho việc viết mã hoặc bạn có thể dựa vào
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 và các phương thức đặc biệt

Đây là mã dựa trên

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
2

Trong ví dụ này, trước tiên bạn xác định một hằng số,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
26, chứa các từ tiếng Anh làm khóa và các từ tiếng Mỹ phù hợp làm giá trị

Sau đó, bạn xác định

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
27, kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8. Phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62 tìm khóa hiện tại. Nếu khóa tồn tại, thì phương thức sẽ trả về nó. Nếu khóa không tồn tại, thì phương thức này sẽ kiểm tra xem khóa đó có được đánh vần bằng tiếng Anh Anh không. Nếu đúng như vậy, thì khóa được dịch sang tiếng Anh Mỹ và được truy xuất từ ​​từ điển cơ bản

Phương thức

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 cố gắng tìm khóa đầu vào trong từ điển
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
26. Nếu khóa đầu vào tồn tại trong
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
26, thì nó sẽ được dịch sang tiếng Anh Mỹ. Cuối cùng, phương thức gán đầu vào
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
33 cho mục tiêu
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
34

Đây là cách lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
27 của bạn hoạt động trong thực tế

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
4

Bằng cách phân lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, bạn đang tiết kiệm cho mình khỏi việc viết nhiều mã. Ví dụ: bạn không phải cung cấp các phương thức như
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
37,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 hoặc
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
90, vì việc triển khai mặc định của chúng sẽ tự động dựa vào các phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 của bạn

Nếu bạn có ít mã hơn để viết, thì bạn sẽ có ít việc phải làm hơn. Quan trọng hơn, bạn sẽ an toàn hơn vì ít mã hơn thường đồng nghĩa với nguy cơ lỗi và sai sót thấp hơn

Hạn chế chính của việc triển khai này là nếu một ngày nào đó bạn quyết định cập nhật

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
27 và làm cho nó kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, thì bạn sẽ phải viết lại hầu hết mã để ngăn chặn việc sử dụng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22

Ví dụ dưới đây cho thấy cách cung cấp chức năng giống như trước khi sử dụng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49 và một số phương thức đặc biệt. Lần này, từ điển tùy chỉnh của bạn hoàn toàn tương thích với
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, vì vậy bạn có thể thay đổi lớp cha bất cứ lúc nào bạn muốn

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
24

Cách triển khai này trông hơi khác so với cách triển khai ban đầu nhưng hoạt động giống nhau. Nó cũng có thể khó viết mã hơn vì bạn không sử dụng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
22 nữa. Thay vào đó, bạn đang sử dụng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
49,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63. Mã này yêu cầu kiến ​​thức nhất định về mô hình dữ liệu của Python, đây là một chủ đề phức tạp và nâng cao

Ưu điểm chính của cách triển khai mới này là lớp của bạn hiện tương thích với

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, vì vậy bạn có thể thay đổi lớp cấp trên bất kỳ lúc nào nếu cần

Ghi chú. Hãy nhớ rằng nếu bạn kế thừa trực tiếp từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, thì bạn cần triển khai lại
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
47 và các phương pháp khác để chúng cũng dịch các phím sang chính tả của người Mỹ khi các phím được thêm vào từ điển

Việc mở rộng chức năng từ điển chuẩn bằng cách phân lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 thường thuận tiện hơn bằng cách phân lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7. Lý do chính là do
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp sẵn có một số lối tắt triển khai và tối ưu hóa buộc bạn phải ghi đè các phương thức mà bạn chỉ có thể kế thừa nếu bạn sử dụng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 làm lớp cha

Loại bỏ các quảng cáo

Một từ điển truy cập các khóa thông qua các giá trị

Một yêu cầu phổ biến khác đối với từ điển tùy chỉnh là cung cấp chức năng bổ sung ngoài hành vi tiêu chuẩn. Ví dụ: giả sử bạn muốn tạo một lớp giống như từ điển cung cấp các phương thức để truy xuất khóa ánh xạ tới một giá trị đích nhất định

Bạn cần một phương thức truy xuất khóa đầu tiên ánh xạ tới giá trị đích. Bạn cũng muốn một phương thức trả về một trình vòng lặp trên các khóa ánh xạ tới các giá trị bằng nhau

Đây là một triển khai có thể có của từ điển tùy chỉnh này

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
0

Lần này, thay vì thừa kế từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8, bạn đang thừa kế từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7. Tại sao? . Do đó, kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 là phù hợp hơn. Nó cũng hiệu quả hơn về mặt hiệu suất, như bạn sẽ thấy sau trong hướng dẫn này

Phương thức

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
61 lặp lại các cặp khóa-giá trị trong từ điển cơ bản. Câu lệnh điều kiện kiểm tra các giá trị khớp với giá trị đích. Khối mã
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62 trả về khóa của giá trị khớp đầu tiên. Nếu khóa mục tiêu bị thiếu, thì phương thức này sẽ tăng
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63

Là một phương thức tạo tạo ra các khóa theo yêu cầu,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
64 sẽ chỉ tạo ra những khóa có giá trị khớp với
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
33 được cung cấp dưới dạng đối số trong lệnh gọi phương thức

Đây là cách từ điển này hoạt động trong thực tế

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
1

Mát mẻ. Từ điển

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
66 của bạn hoạt động như mong đợi. Nó kế thừa các tính năng của từ điển cốt lõi từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 của Python và triển khai chức năng mới trên đó

Nói chung, bạn nên sử dụng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 để tạo một lớp giống như từ điển hoạt động giống như lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp nhưng tùy chỉnh một số chức năng cốt lõi của nó, chủ yếu là các phương thức đặc biệt như
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
63 và
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
62

Mặt khác, nếu bạn chỉ cần một lớp giống như từ điển với chức năng mở rộng không ảnh hưởng hoặc sửa đổi hành vi cốt lõi của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, thì tốt hơn hết là bạn nên kế thừa trực tiếp từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 trong Python. Thực hành này sẽ nhanh hơn, tự nhiên hơn và hiệu quả hơn

Từ điển với các chức năng bổ sung

Ví dụ cuối cùng về cách triển khai từ điển tùy chỉnh với các tính năng bổ sung, giả sử bạn muốn tạo một từ điển cung cấp các phương thức sau

Phương thức Mô tả

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
74Lấy một đối số có thể gọi là
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
75 làm đối số và áp dụng nó cho tất cả các giá trị trong từ điển cơ bản
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
76Xóa một
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
34 đã cho khỏi từ điển cơ sở
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
78Trả về
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
79 hoặc
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
80 tùy thuộc vào việc từ điển có trống hay không

Để triển khai ba phương thức này, bạn không cần sửa đổi hành vi cốt lõi của lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp. Vì vậy, phân lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 thay vì
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 dường như là cách tốt nhất

Đây là mã triển khai các phương thức cần thiết trên đầu trang của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
2

Trong ví dụ này,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
85 lấy một đối số có thể gọi được và áp dụng nó cho mọi giá trị trong từ điển cơ bản. Giá trị được chuyển đổi sau đó được gán lại cho khóa ban đầu. Phương thức
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
86 sử dụng câu lệnh để xóa khóa mục tiêu khỏi từ điển. Cuối cùng,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
78 sử dụng hàm
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
89 tích hợp để tìm hiểu xem từ điển có trống hay không

Đây là cách hoạt động của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
90

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
3

Trong các ví dụ này, trước tiên bạn tạo một phiên bản của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
90 bằng cách sử dụng từ điển thông thường làm đối số. Sau đó, bạn gọi
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
85 trên từ điển mở rộng. Phương pháp này lấy một hàm
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
93 làm đối số và áp dụng nó cho mọi giá trị trong từ điển, chuyển đổi giá trị đích thành bình phương của nó

Sau đó,

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
86 lấy một khóa hiện có làm đối số và xóa cặp khóa-giá trị tương ứng khỏi từ điển. Cuối cùng,
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
78 trả về
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
80 vì
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
97 không trống. Nó sẽ trả về
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
79 nếu từ điển cơ bản trống

Loại bỏ các quảng cáo

Xem xét hiệu suất

Kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 có thể ngụ ý chi phí hiệu năng vì lớp này bằng Python thuần túy. Mặt khác, lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 tích hợp được viết bằng C và được tối ưu hóa cao cho hiệu suất. Vì vậy, nếu bạn cần sử dụng một từ điển tùy chỉnh trong mã quan trọng về hiệu suất, thì hãy đảm bảo tính thời gian cho mã của bạn để tìm các vấn đề về hiệu suất tiềm ẩn

Để kiểm tra xem các vấn đề về hiệu suất có thể phát sinh khi bạn kế thừa từ

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 thay vì
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 hay không, hãy quay lại lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
90 của bạn và sao chép mã của nó vào hai lớp khác nhau, một lớp kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 và lớp kia kế thừa từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8

Các lớp học của bạn sẽ trông giống như thế này

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
4

Sự khác biệt duy nhất giữa hai lớp này là lớp con

>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
06
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 và lớp con
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
08
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8

Để kiểm tra hiệu suất của chúng, bạn có thể bắt đầu bằng cách tính thời gian cho các hoạt động từ điển cốt lõi, chẳng hạn như khởi tạo lớp. Chạy đoạn mã sau trong phiên tương tác Python của bạn

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
5

Trong đoạn mã này, bạn sử dụng mô-đun cùng với hàm

>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
11 để đo thời gian thực thi của một đoạn mã. Trong ví dụ này, mã đích bao gồm khởi tạo
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
06 và
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
08

Khi bạn đã chạy mã đo thời gian này, thì bạn so sánh cả hai lần khởi tạo. Trong ví dụ cụ thể này, việc khởi tạo lớp dựa trên

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 chậm hơn so với lớp bắt nguồn từ
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7. Kết quả này là một chỉ báo về sự khác biệt hiệu suất nghiêm trọng

Đo thời gian thực hiện các chức năng mới cũng có thể thú vị. Ví dụ: bạn có thể kiểm tra thời gian thực hiện của

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
85. Để thực hiện kiểm tra này, hãy tiếp tục và chạy đoạn mã sau

>>>

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
6

Sự khác biệt về hiệu suất giữa lớp dựa trên

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 và lớp dựa trên
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 lần này không lớn lắm, nhưng nó vẫn tồn tại

Thông thường, khi bạn tạo một từ điển tùy chỉnh bằng cách phân lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7, bạn có thể mong đợi các thao tác từ điển tiêu chuẩn sẽ hiệu quả hơn trong lớp này so với lớp dựa trên
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8. Mặt khác, chức năng mới có thể có thời gian thực hiện tương tự ở cả hai lớp. Làm thế nào bạn biết đó là cách hiệu quả nhất để đi?

Điều đáng chú ý là nếu bạn đang muốn sửa đổi chức năng cốt lõi của từ điển, thì

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 có lẽ là cách tốt nhất vì trong trường hợp này, bạn sẽ chủ yếu viết lại lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 bằng Python thuần túy

Phần kết luận

Bây giờ bạn đã biết cách tạo các lớp giống như từ điển tùy chỉnh với hành vi được sửa đổi và các chức năng mới. Bạn đã học cách làm điều này bằng cách trực tiếp phân lớp con lớp

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 có sẵn và bằng cách kế thừa từ lớp
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 có sẵn trong mô-đun
>>> numbers = UpperCaseDict()
>>> numbers["one"] = 1
>>> numbers["two"] = 2
>>> numbers["three"] = 3

>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3}

>>> numbers.update({"four": 4})
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}

>>> numbers.setdefault("five", 5)
5
>>> numbers
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
2

Trong hướng dẫn này, bạn đã học cách

  • Tạo các lớp giống như từ điển bằng cách kế thừa từ lớp
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    7 tích hợp
  • Xác định những cạm bẫy phổ biến khi kế thừa lớp
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    7 tích hợp sẵn của Python
  • Xây dựng các lớp giống như từ điển bằng cách phân lớp
    >>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
    >>> numbers
    {'one': 1, 'two': 2, 'three': 3}
    
    8 từ mô-đun
    >>> numbers = UpperCaseDict()
    >>> numbers["one"] = 1
    >>> numbers["two"] = 2
    >>> numbers["three"] = 3
    
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3}
    
    >>> numbers.update({"four": 4})
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4}
    
    >>> numbers.setdefault("five", 5)
    5
    >>> numbers
    {'ONE': 1, 'TWO': 2, 'THREE': 3, 'four': 4, 'five': 5}
    
    2

Bạn cũng đã viết một số ví dụ thực tế giúp bạn hiểu những ưu và nhược điểm của việc sử dụng

>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
8 so với
>>> numbers = UpperCaseDict({"one": 1, "two": 2, "three": 3})
>>> numbers
{'one': 1, 'two': 2, 'three': 3}
7 khi tạo các lớp từ điển tùy chỉnh của mình

Bây giờ bạn đã sẵn sàng để tạo từ điển tùy chỉnh của mình và tận dụng toàn bộ sức mạnh của loại dữ liệu hữu ích này trong Python để đáp ứng nhu cầu mã hóa của bạn

Tham gia ngay. Nhấp vào đây để tham gia Bản tin Python thực sự và bạn sẽ không bao giờ bỏ lỡ một bài hướng dẫn, cập nhật khóa học hoặc bài đăng nào khác về Python

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Ghi đè __dict__ python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Leodanis Pozo Ramos

Ghi đè __dict__ python
Ghi đè __dict__ python

Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác

» Tìm hiểu thêm về Leodanis


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Ghi đè __dict__ python

Aldren

Ghi đè __dict__ python

Bartosz

Ghi đè __dict__ python

Geir Arne

Ghi đè __dict__ python

kate

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

__ dict __ trong Python là gì?

Tất cả đối tượng trong Python đều có thuộc tính __dict__, là đối tượng từ điển chứa tất cả các thuộc tính được xác định cho chính đối tượng đó . Việc ánh xạ các thuộc tính với các giá trị của nó được thực hiện để tạo từ điển.

Làm cách nào để kế thừa dict trong Python?

Trong Python, bạn có thể làm điều này bằng cách kế thừa từ một lớp cơ sở trừu tượng, bằng cách trực tiếp phân lớp con lớp dict có sẵn hoặc bằng cách kế thừa từ UserDict .