Hướng dẫn python import mappingproxy - ánh xạ nhập khẩu python

Tôi tự hỏi tại sao một lớp __dict__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__)

Hướng dẫn python import mappingproxy - ánh xạ nhập khẩu python

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

Hướng dẫn python import mappingproxy - ánh xạ nhập khẩu python

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:
    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 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ạ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
    
    6 và có thể gán các thuộc tính mới thông qua __dict__, ví dụ:
    from types import MappingProxyType
    d={'key': "value"}
    m = MappingProxyType(d)
    print(type(m)) # 
    
    m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
    
    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 returns
    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 as
    from 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 through __dict__, e.g.
    from types import MappingProxyType
    d={'key': "value"}
    m = MappingProxyType(d)
    print(type(m)) # 
    
    m['key']='new' #TypeError: 'mappingproxy' object does not support item assignment
    
    8.
  • Python 3.0 - 3.2:
    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 Trả về
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    0, sự khác biệt được giới thiệu. Cố gắng gán một Attribte mới cho
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    1. Có một nỗ lực để thêm dictproxy như một loại tích hợp công khai.
    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 returns
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    0, the difference is introduced. Trying to assign a new attribte gives
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    1. There was an attempt to add dictproxy as a public built-in type.
  • Python 3.3: Thêm loại
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    3 được mô tả ở trên.
    adds the
    class C:pass
    ci=C()
    print(type(C.__dict__)) #
    print(type(ci.__dict__)) #
    
    3 type described above.

Hướng dẫn python import mappingproxy - ánh xạ nhập khẩu python

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

Hướng dẫn python import mappingproxy - ánh xạ nhập khẩu python

FunnyDmanfunnydmanfunnydman

7.4863 Huy hiệu vàng30 Huy hiệu bạc51 Huy hiệu Đồng3 gold badges30 silver badges51 bronze badges