Tôi tự hỏi tại sao một lớp __dict__
là mappingproxy
, nhưng một ví dụ __dict__
chỉ là một đơn giản dict
>>> class A:
... pass
>>> a = A[]
>>> type[a.__dict__]
>>> type[A.__dict__]
DREFTYMAC
30.5K26 Huy hiệu vàng116 Huy hiệu bạc179 Huy hiệu đồng26 gold badges116 silver badges179 bronze badges
Hỏi ngày 22 tháng 9 năm 2015 lúc 15:08Sep 22, 2015 at 15:08
Điều này giúp thông dịch viên đảm bảo rằng các khóa cho các thuộc tính và phương thức cấp độ lớp chỉ có thể là chuỗi.
Ở những nơi khác, Python là một "ngôn ngữ người lớn đồng ý", có nghĩa là chỉ định cho các đối tượng được người dùng phơi bày và có thể thay đổi. Tuy nhiên, trong trường hợp các thuộc tính và phương thức cấp độ lớp cho các lớp, nếu chúng ta có thể đảm bảo rằng các khóa là chuỗi, chúng ta có thể đơn giản hóa và tăng tốc mã trường hợp phổ biến để tra cứu thuộc tính và phương thức ở cấp độ lớp. Cụ thể, logic tìm kiếm __MRO__ cho các lớp kiểu mới được đơn giản hóa và tăng tốc bằng cách giả sử các phím Dict của lớp là chuỗi.
Đã trả lời ngày 22 tháng 9 năm 2015 lúc 15:13Sep 22, 2015 at 15:13
Raymond Hettingerraymond HettingerRaymond Hettinger
209K62 Huy hiệu vàng368 Huy hiệu bạc471 Huy hiệu Đồng62 gold badges368 silver badges471 bronze badges
8
Một bản đồ lập bản đồ chỉ đơn giản là một dict không có phương pháp __setattr__
.
Bạn có thể kiểm tra và tham khảo mã này.
from types import MappingProxyType
d={'key': "value"}
m = MappingProxyType[d]
print[type[m]] #
m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
Lập bản đồ là từ Python 3.3. Mã sau đây cho thấy các loại Dict:
class C:pass
ci=C[]
print[type[C.__dict__]] #
print[type[ci.__dict__]] #
Đã trả lời ngày 4 tháng 6 năm 2019 lúc 20:05Jun 4, 2019 at 20:05
tuyến tiền liệtprosti
38.3k11 Huy hiệu vàng171 Huy hiệu bạc146 Huy hiệu đồng11 gold badges171 silver badges146 bronze badges
Vì loại Python 3.3 mappingproxy
được đổi tên từ dictproxy
. Có một cuộc thảo luận thú vị về chủ đề này.
Có một chút khó khăn để tìm tài liệu cho loại này, nhưng phương thức tài liệu cho VARS mô tả điều này một cách hoàn hảo [mặc dù nó không được ghi lại trong một thời gian]:
Các đối tượng như mô -đun và phiên bản có thuộc tính
__dict__
có thể cập nhật; Tuy nhiên, các đối tượng khác có thể có các hạn chế ghi trên các thuộc tính__dict__
của chúng [ví dụ: các lớp sử dụng một loại.
Nếu bạn cần gán một thuộc tính lớp mới, bạn có thể sử dụng
from types import MappingProxyType
d={'key': "value"}
m = MappingProxyType[d]
print[type[m]] #
m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
2. Cần lưu ý rằng mappingproxy
không phải là JSON serializable, hãy xem vấn đề để hiểu lý do tại sao.Ngoài ra lịch sử của loại này là một khá thú vị:
- Python 2.7:
4 Trả vềfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
5 dưới dạngfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
6 và có thể gán các thuộc tính mới thông quafrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
__dict__
, ví dụ:
8.from types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
4 returnsfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
5 asfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
6, and it's possible to assign new attributes throughfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
__dict__
, e.g.
8.from types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
- Python 3.0 - 3.2:
4 Trả vềfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
0, sự khác biệt được giới thiệu. Cố gắng gán một Attribte mới choclass C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
1. Có một nỗ lực để thêmclass C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
dictproxy
như một loại tích hợp công khai.
4 returnsfrom types import MappingProxyType d={'key': "value"} m = MappingProxyType[d] print[type[m]] # m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
0, the difference is introduced. Trying to assign a new attribte givesclass C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
1. There was an attempt to addclass C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
dictproxy
as a public built-in type. - Python 3.3: Thêm loại
3 được mô tả ở trên. adds theclass C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
3 type described above.class C:pass ci=C[] print[type[C.__dict__]] # print[type[ci.__dict__]] #
Maggyero
5.1323 Huy hiệu vàng34 Huy hiệu bạc54 Huy hiệu đồng3 gold badges34 silver badges54 bronze badges
Đã trả lời ngày 8 tháng 12 năm 2019 lúc 7:26Dec 8, 2019 at 7:26
FunnyDmanfunnydmanfunnydman
7.4863 Huy hiệu vàng30 Huy hiệu bạc51 Huy hiệu Đồng3 gold badges30 silver badges51 bronze badges