2010-07-30 36 views
10

Tôi muốn biết lý do tại sao người ta có thể tạo thuộc tính mới ("mới" có nghĩa là "không được định nghĩa trước đó trong nội dung lớp") cho một thể hiện của loại tùy chỉnh, nhưng không thể thực hiện tương tự cho một được tích hợp sẵn, chẳng hạn như số object.Tại sao các loại tùy chỉnh chấp nhận các thuộc tính ad-hoc trong Python (và các trình tạo sẵn không)?

Một mã ví dụ:

>>> class SomeClass(object): 
...  pass 
... 
>>> sc = SomeClass() 
>>> sc.name = "AAA" 
>>> sc.name 
'AAA' 
>>> obj = object() 
>>> obj.name = "BBB" 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'name' 

Trả lời

6

Một số đối tượng không có thuộc tính __dict__ (đó là một cuốn từ điển mà các cửa hàng tất cả các tùy chỉnh 'vừa được định nghĩa' thuộc tính). Bạn có thể mô phỏng hành vi tương tự bằng biến __slots__ (xem python reference). Khi bạn đang phân lớp một lớp với __dict__, biến __slots__ không có hiệu lực. Và vì bạn luôn phân lớp đối tượng cho các lớp kiểu mới, đối tượng không được có __dict__, vì điều đó sẽ không thể sử dụng __slots__. Các lớp không có __slots__ mất ít bộ nhớ hơn và có thể nhanh hơn một chút.