Tham số hàm tạo lớp. từ điển Show
class Bunch(object): def __init__(self, **fields): self.__dict__ = fields p = Bunch(x=2.3, y=4.5) print p print p.__dict__ Ví dụ liên quan trong cùng thể loạiBản chất Python là một ngôn ngữ rất năng động. Các biến không cần khai báo và có thể được thêm dưới dạng thuộc tính ở hầu hết mọi nơi. Hãy xem xét một lớp trống như thế này Đây là một định nghĩa đầy đủ về một lớp trong Python. Cấp, nó không làm gì cả, nhưng nó vẫn hợp lệ Tại bất kỳ thời điểm nào sau này, chúng ta có thể "vá" các thuộc tính cho lớp của mình như thế này
Lớp có giá trị 5 mới này kể từ thời điểm đóNếu chúng tôi khởi tạo lớp này với 6, chúng tôi có thể xác minh rằng giá trị 5 là 42
Tất nhiên, chúng ta cũng có thể thêm các thuộc tính vào các thể hiện của mình
Bạn đã bao giờ tự hỏi những thuộc tính này được lưu trữ ở đâu chưa?
Python sẽ không phải là Python nếu không có hành vi được xác định rõ ràng và có thể tùy chỉnh cho các thuộc tính. Các thuộc tính của một “thứ” trong Python được lưu trữ trong một thuộc tính ma thuật có tên là 8. Chúng ta có thể truy cập nó như vậy________số 8 Như bạn có thể thấy, 5 được lưu trữ trong chính 8 của 1, trong khi 2 được lưu trữ trong 8 của 4Điều đó có nghĩa là, bất cứ khi nào bạn truy cập vào 5, Python sẽ tìm trong 6 trước, sau đó là trong 7. Nếu thuộc tính 2 không được tìm thấy trong từ điển, thì một 9 sẽ xuất hiệnGhi chú bên lềMột "thứ" trong Python là gì? . Về mặt logic, một lớp như 1 thuộc loại 2, nghĩa là bản thân lớp đó là một đối tượng thuộc loại 2. Vì điều này nghe có vẻ khó hiểu nên tôi sử dụng thuật ngữ thông tục “thứ” để thay thế“Hack” thuộc tính >>> my_object.class_attribute 428Như mọi khi trong Python, thuộc tính 8 hoạt động giống như bất kỳ thuộc tính nào khác trong Python. Vì Python là ngôn ngữ thích chuyển qua tham chiếu, nên chúng ta có thể xem xét một lỗi xảy ra khá thường xuyên do tình cờ. Hãy xem xét một lớp 6 7Bây giờ, hãy tạo một số sổ địa chỉ và tạo một số địa chỉ 8Thật thú vị, Alice và Bob hiện chia sẻ một sổ địa chỉ 9Điều này là do thuộc tính 7 được xác định ở cấp độ 2. Danh sách trống chỉ được tạo một lần ( 9), cụ thể là khi trình thông dịch Python tạo lớp. Do đó, đối với bất kỳ trường hợp tiếp theo nào của lớp 6, cùng một 71 được tham chiếu bởi 7. Chúng ta có thể sửa lỗi này bằng cách di chuyển việc tạo 71 trống sang cấp độ phiên bản như vậy 7Bằng cách di chuyển việc tạo danh sách trống sang hàm tạo (phương thức ______274), một danh sách mới được tạo bất cứ khi nào một phiên bản mới của 6 được tạo. Do đó, các phiên bản không vô tình chia sẻ cùng một 71 nữaGiới thiệu BorgChúng ta có thể tận dụng hành vi này bằng cách nào đó có chủ ý không? . Có một Mẫu thiết kế được gọi là Singleton. Điều này đảm bảo rằng chỉ có một thể hiện của lớp trong thời gian chạy chương trình. Ví dụ: nó có thể hữu ích nếu điều này được sử dụng cho lớp kết nối cơ sở dữ liệu hoặc kho lưu trữ cấu hình Lưu ý rằng bạn chỉ nên thỉnh thoảng sử dụng các lớp đơn lẻ vì chúng giới thiệu một số trạng thái chung trong chương trình của bạn, điều này gây khó khăn cho việc kiểm tra các thành phần riêng lẻ trong chương trình của bạn một cách cô lập Điều gì sẽ là một cách Pythonic để thực hiện một mẫu đơn lẻ? Hãy xem xét lớp học này 1Lớp này có thuộc tính 77 được khởi tạo dưới dạng một mảng trống. Chúng ta đã biết từ các đoạn trước rằng đối tượng 78 là cùng một đối tượng cho lớp. Sau đó, bên trong hàm tạo ( 74), chúng tôi đặt 8 của thể hiện thành từ điển dùng chung này. Do đó, tất cả các thuộc tính được thêm động được chia sẻ giữa mỗi phiên bản của lớp đóHãy kiểm tra 6Tại sao chúng ta không thể đặt trực tiếp 81 cho lớp như vậy 0Điều này là do trong trường hợp sau, chúng tôi đặt thuộc tính 8 cho chính lớp đó. Tuy nhiên, chúng tôi truy cập thuộc tính của thể hiện bằng cách gõ 83. Chỉ khi thuộc tính 8 được đặt ở cấp độ phiên bản, chúng tôi mới có thể sử dụng mẫu Borg của mình. Cách để đạt được điều này là sử dụng hàm tạo để thay đổi thuộc tính 8 ở cấp độ thể hiệnSử dụng bộ nhớ của các thuộc tínhTự động thêm các thuộc tính trong thời gian chạy ở cấp độ phiên bản hoặc cấp độ lớp đi kèm với chi phí. Cấu trúc từ điển khá tốn bộ nhớ trong nội bộ của Python. Trong trường hợp bạn khởi tạo rất nhiều (hàng nghìn) phiên bản, điều này có thể trở thành nút cổ chai Tuy nhiên, điều đầu tiên trước tiên. Khe cắm là gì? . Khi bạn thêm thuộc tính 86 vào 2, bạn xác định trước thuộc tính thành viên nào bạn cho phép. Chúng ta hãy có một cái nhìn 1Với định nghĩa này, bất kỳ phiên bản nào của 88 chỉ có thể truy cập thuộc tính 89. Truy cập các thuộc tính (động) khác sẽ làm tăng 9 2Hạn chế khả năng thêm thuộc tính động rất hữu ích để giảm lỗi thời gian chạy có thể xảy ra do lỗi chính tả trong tên thuộc tính. Tuy nhiên, quan trọng hơn, hạn chế này sẽ làm giảm mức sử dụng bộ nhớ của mã của bạn – trong một số trường hợp đáng kể. Hãy thử kiểm tra điều này Chúng tôi tạo hai lớp, một lớp có rãnh và một lớp không có rãnh. Cả hai lớp đều truy cập một thuộc tính có tên là 89 bên trong phương thức 74 của chúng và trong trường hợp của lớp có rãnh, đó là thuộc tính duy nhất trong 86Chúng tôi tạo một triệu phiên bản cho mỗi lớp và lưu trữ các phiên bản này trong danh sách. Sau đó, chúng tôi xem kích thước của danh sách. Danh sách các thể hiện của lớp có rãnh nên nhỏ hơn 3Tuy nhiên, chúng tôi nhận lại giá trị là 94 cho mỗi danh sách. Vậy làm thế nào để chúng ta tiết kiệm bộ nhớ sau đó sử dụng các khe cắm?Hãy sử dụng mô-đun sử dụng bộ nhớ ipython để kiểm tra lượng bộ nhớ được tiêu thụ trong thời gian chạy chương trình thử nghiệm của chúng tôi 4Như bạn có thể thấy, phiên bản có rãnh chỉ chiếm khoảng 85 MiB RAM, trong khi phiên bản không có rãnh cần hơn 200 MiB, mặc dù kích thước kết quả của các danh sách là như nhau Lý do cho điều này là cách Python xử lý nội bộ của 78. Khi không chỉ định 86, Python mặc định sử dụng từ điển để lưu trữ các thuộc tính. Từ điển này có bản chất động, có thể thay đổi kích thước, cần được sắp xếp theo các phím, v.v. Đó là lý do tại sao Python cần rất nhiều bộ nhớ để quản lý từ điểnTrong phiên bản có rãnh của lớp, các tính năng chính của 78 không còn cần thiết nữa vì không cho phép thay đổi kích thước động nữa. Do đó, Python phân bổ bộ nhớ trước cho các thuộc tính được đề cập trong 86
Tôi nên sử dụng dict() hay {}?tl;dr. Với CPython 2. 7, việc sử dụng dict() để tạo từ điển mất tới 6 lần lâu hơn và liên quan đến nhiều hoạt động cấp phát bộ nhớ hơn so với cú pháp theo nghĩa đen. Sử dụng {} để tạo từ điển, đặc biệt nếu bạn điền sẵn từ điển, trừ khi cú pháp theo nghĩa đen không phù hợp với trường hợp của bạn .
Bạn có thể đặt một từ điển trong một lớp Python không?Nếu bạn muốn sử dụng từ điển trên toàn cầu trong một lớp, thì bạn cần xác định từ đó trong phần nơi bạn sử dụng lớp của mình . nếu bạn đang sử dụng lớp của mình trong chính, thì hãy xác định nó ở đó. Theo mặc định, một từ điển hoặc danh sách o là toàn cầu.
{} có phải là từ điển trong Python không?Từ điển Python là gì? . Từ điển được viết bằng dấu ngoặc nhọn ({}), bao gồm các cặp khóa-giá trị được phân tách bằng dấu phẩy (,) . Một dấu hai chấm (. ) tách từng khóa khỏi giá trị của nó.
__ dict __ trong lớp Python là gì?__dict__ là Từ điển hoặc đối tượng ánh xạ khác được sử dụng để lưu trữ các thuộc tính (có thể ghi) của đối tượng . Hay nói một cách đơn giản, mọi đối tượng trong python đều có một thuộc tính được ký hiệu là __dict__. Và đối tượng này chứa tất cả các thuộc tính được xác định cho đối tượng. |