Hướng dẫn __dict__ python

Trước hết A.__dict__.__dict__là khác với A.__dict__['__dict__'], và trước đây không tồn tại. Cái sau là __dict__thuộc tính mà các thể hiện của lớp sẽ có. Đó là một đối tượng mô tả trả về từ điển nội bộ của các thuộc tính cho trường hợp cụ thể. Nói tóm lại, __dict__thuộc tính của một đối tượng không thể được lưu trữ trong các đối tượng __dict__, vì vậy nó được truy cập thông qua một mô tả được xác định trong lớp.

Để hiểu điều này, bạn phải đọc tài liệu về giao thức mô tả .

Phiên bản ngắn:

  1. Đối với một thể hiện của lớp A, quyền truy cập instance.__dict__được cung cấp bởi A.__dict__['__dict__']nó giống như vars[A]['__dict__'].
  2. Đối với lớp A, quyền truy cập A.__dict__được cung cấp bởi type.__dict__['__dict__'][về lý thuyết] giống như vars[type]['__dict__'].

Phiên bản dài:

Cả hai lớp và đối tượng đều cung cấp quyền truy cập vào cả các thuộc tính thông qua toán tử thuộc tính [được triển khai thông qua lớp hoặc siêu dữ liệu __getattribute__] và __dict__thuộc tính / giao thức được sử dụng bởi vars[ob].

Đối với các đối tượng bình thường, __dict__đối tượng tạo một dictđối tượng riêng biệt , lưu trữ các thuộc tính và __getattribute__trước tiên cố gắng truy cập vào nó và lấy các thuộc tính từ đó [trước khi cố gắng tìm thuộc tính trong lớp bằng cách sử dụng giao thức mô tả và trước khi gọi __getattr__]. Bộ __dict__mô tả trên lớp thực hiện truy cập vào từ điển này.

  • x.nametương đương với cố gắng những theo thứ tự: x.__dict__['name'], type[x].name.__get__[x, type[x]],type[x].name
  • x.__dict__ làm tương tự nhưng bỏ qua cái đầu tiên vì lý do rõ ràng

Vì nó không thể cho __dict__các instancephải được lưu trữ trong __dict__các ví dụ, nó được truy cập thông qua giao thức mô tả trực tiếp thay vào đó, và được lưu trữ trong một lĩnh vực đặc biệt trong trường hợp.

Một kịch bản tương tự là đúng đối với các lớp, mặc dù chúng __dict__là một đối tượng proxy đặc biệt giả vờ là một từ điển [nhưng có thể không phải là nội bộ] và không cho phép bạn thay đổi nó hoặc thay thế nó bằng một đối tượng khác. Proxy này cho phép bạn, trong số tất cả những người khác, truy cập các thuộc tính của một lớp dành riêng cho nó và không được xác định trong một trong các cơ sở của nó.

Theo mặc định, một vars[cls]lớp trống mang ba mô tả - __dict__để lưu trữ các thuộc tính của các thể hiện, __weakref__được sử dụng bên trong weakrefvà chuỗi doc của lớp. Hai cái đầu tiên có thể biến mất nếu bạn xác định __slots__. Sau đó, bạn sẽ không có __dict____weakref__thuộc tính, nhưng thay vào đó, bạn có một thuộc tính lớp duy nhất cho mỗi vị trí. Các thuộc tính của thể hiện sau đó sẽ không được lưu trữ trong một từ điển và việc truy cập chúng sẽ được cung cấp bởi các mô tả tương ứng trong lớp.

Và cuối cùng, sự không nhất quán A.__dict__khác với A.__dict__['__dict__']là vì thuộc tính __dict__, ngoại trừ, không bao giờ được tra cứu vars[A], vì vậy điều gì đúng với nó thực tế không đúng với bất kỳ thuộc tính nào khác mà bạn sử dụng. Ví dụ, A.__weakref__là điều tương tự như A.__dict__['__weakref__']. Nếu sự không nhất quán này không tồn tại, sử dụng A.__dict__sẽ không hoạt động và vars[A]thay vào đó bạn phải luôn sử dụng .

92 hữu ích 1 bình luận chia sẻ

Chủ Đề