2016-11-28 22 views
9
>>> a = object() 
>>> a.x = 5 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'x' 
>>> b = lambda:0 
>>> b.x = 5 
>>> b.x 
5 

Tại sao các trường hợp của lớp object không có __dict__, khiến cho ứng dụng đó hoạt động như không thay đổi về mặt ngữ nghĩa? Lý do chọn thiết kế này là gì?Tại sao các trường hợp của lớp `object` bất biến trong Python?

Cụ thể, tại sao:

trường hợp của các loại quy định tại C không có một thuộc tính __dict__ bởi mặc định.

Như đã nêu trong this question.

+0

Bản sao có thể có của [Python: lý do tại sao \ _ \ _ dict \ _ \ _ thuộc tính không có trong các phiên bản lớp được tạo sẵn] (http://stackoverflow.com/questions/9502183/python-why-is-dict-attribute -nội dung không có trong lớp) –

Trả lời

7

Các tài liệu cho Python 2 is not very helpful trong việc đưa ra một lời giải thích là tại sao bạn không thể gán thuộc tính cho một object(), nhưng tài liệu cho Python 3 provides a bit more information:

Return một đối tượng gì đặc biệt mới . đối tượng là cơ sở cho tất cả các lớp. Nó có các phương thức chung cho tất cả các cá thể của các lớp Python. Hàm này không chấp nhận bất kỳ đối số nào.

Lưu ý: đối tượng không có một__dict__, vì vậy bạn không thể gán thuộc tính tùy ý để một thể hiện của lớp đối tượng.

Vì vậy, lý do bạn không thể thêm các thuộc tính tùy ý để object() của bạn dường như là vì thực tế rằng object() trường hợp không có một thực hiện các thuộc tính __dict__, không phải vì object() trường hợp là không thay đổi:

>>> hasattr(object(), '__dict__') 
False 
>>> 

Một điều thú vị khác, nhưng có lẽ không liên quan đến cuộc thảo luận trong tay, là trong khi một cá thể của đối tượng có thể không có thực hiện __dict__, chính lớp object sẽ thực hiện:

>>> hasattr(object, '__dict__') 
True 

Đối với tại sao phần của câu hỏi, tôi không thể tìm thấy bất kỳ lý do chính xác tại sao object() không có __dict__. Có lẽ là vì - như @tdelany đã đề cập đến trong các nhận xét - một chi tiết triển khai. Nếu bạn thực sự muốn có câu trả lời dứt khoát, bạn nên ask Guido himself.

+0

@SeanPianka No. Nhưng tôi vẫn đang tìm kiếm. Tôi nghĩ sẽ hữu ích nếu bạn không thể thêm các thuộc tính vào một 'object()'. –

+0

Bởi vì nó là một lớp nội trang. –

+3

'đối tượng' được triển khai trong C và phổ biến của nó là các đối tượng mở rộng không có thuộc tính phụ. Xem xét rằng cá thể lớp thông thường '__dict__' là một đối tượng, không có gì ngạc nhiên khi' đối tượng' không có! – tdelaney

Các vấn đề liên quan