2015-02-03 18 views
6

Làm thế nào là nó có thể rằngĐối tượng() là gì?

class EmptyClass: 
    def __init__(self): 
     pass 

e = EmptyClass() 
e.a = 123 

công trình và:

o = object() 
o.a = 123 

không (AttributeError: 'object' object has no attribute 'a') trong khi

print isinstance(e, object) 
>>> True 

?

Điều gì là object() tốt cho lúc đó, khi bạn không thể sử dụng nó như thế này?

+1

Đơn giản chỉ vì mọi thứ đều là đối tượng. Vì vậy, cho bất cứ điều gì tồn tại, 'đối tượng' phải tồn tại quá. – Kroltan

+0

Có lẽ [câu hỏi này và nó là câu trả lời] (http://stackoverflow.com/questions/4015417/python-class-inherits-object) có thể cung cấp cho bạn một số ánh sáng – Barranka

Trả lời

12

Bạn không thể thêm thuộc tính vào phiên bản objectobject không có __dict__ attribute (lưu trữ thuộc tính). Từ docs:

class object

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

Lưu ý: object không có __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 object.

object không có công dụng của nó:

  1. Như đã trình bày ở trên, nó phục vụ như là lớp cơ sở cho tất cả các đối tượng trong Python. Mọi thứ bạn thấy và sử dụng cuối cùng đều dựa trên object.

  2. Bạn có thể sử dụng object để tạo sentinel values hoàn toàn độc đáo. Thử nghiệm chúng với isis not sẽ chỉ trả về True khi một trường hợp chính xác object được cung cấp.

  3. Trong Python 2.x, bạn có thể (nên) kế thừa từ object để tạo một new-style class. Các lớp học kiểu mới có chức năng nâng cao và hỗ trợ tốt hơn. Lưu ý rằng tất cả các lớp là kiểu mới tự động trong Python 3.x.

+2

Nó cũng có ích trong việc tạo ra các đối tượng duy nhất mà chúng ta có thể sử dụng làm sentinel value (chúng ta không thể sử dụng 'None' ở khắp mọi nơi). –

+0

Ý tưởng hay, tôi sẽ thêm nó. – iCodez

+0

Tôi thỉnh thoảng sử dụng nó để tạo một đối tượng duy nhất (với một 'id' duy nhất) có thể được sử dụng làm điểm đánh dấu đặc biệt hoặc [giá trị sentinel] (http://en.wikipedia.org/wiki/Sentinel_value) khi xử lý dữ liệu có thể chứa các mục 'None' hoặc zero-length là các giá trị không phải là sentinel hợp lệ. – martineau

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