2013-09-22 53 views
7

Tôi đang cố gắng tìm ra những gì tôi sẽ sử dụng hàm tích hợp sẵn cho object(). Nó không có đối số và trả về một "đối tượng đặc biệt" của kiểu phổ biến cho tất cả các lớp Python và có tất cả các phương thức chung cho tất cả các lớp Python.Khi nào thì đối tượng() được tích hợp hữu ích?

Để trích dẫn Jack Skellington, WHAT. IS. THIS?

+0

Nó không được dùng để làm chức năng; nó dự định được sử dụng một lớp cơ sở. – refi64

+0

Trong python 3? Tại sao? Tôi sẽ kiếm được gì từ đó? Các lớp tự động kế thừa các phương thức đó, phải không? – Aerovistae

+3

Tôi tìm thấy nó vui nhộn như thế nào trong liên kết tài liệu mà bạn cung cấp, nó có một số văn bản siêu liên kết mà đệ quy chỉ đến chính nó. – Shashank

Trả lời

11

Thậm chí nếu bạn không cần phải lập trình với nó, object phục vụ một mục đích: đó là lớp chung mà từ đó tất cả các đối tượng khác có nguồn gốc. Đây là lớp cuối cùng được liệt kê theo phương pháp mro (method resolution order). Chúng ta cần một tên và đối tượng cho khái niệm này, và object phục vụ mục đích này.

Sử dụng khác cho object là tạo sentinels.

sentinel = object() 

Điều này thường được sử dụng trong lập trình đa luồng - được chuyển qua hàng đợi - đến signal a termination event. Chúng tôi có thể không muốn gửi None hoặc bất kỳ giá trị nào khác vì trình xử lý hàng đợi có thể cần phải diễn giải các giá trị đó dưới dạng đối số được xử lý. Chúng tôi cần một số giá trị duy nhất mà không có phần nào khác của chương trình có thể tạo ra.

Tạo một đường dẫn theo cách này chỉ cung cấp một đối tượng duy nhất đảm bảo không phải là giá trị hàng đợi bình thường và do đó có thể được kiểm tra và sử dụng làm tín hiệu cho một số sự kiện đặc biệt. Có những khả năng khác, chẳng hạn như tạo ra một lớp, hoặc thể hiện lớp, hoặc một hàm, nhưng tất cả các lựa chọn thay thế là lớn hơn, nhiều tài nguyên hơn, và không phải là pithy như object().

4

Điều này hữu ích nhất nếu bạn ghi đè dấu chấm (đặc biệt là __setattr__), nó cho phép bạn ngắt đoạn đệ quy. Ví dụ:

class SomeClass(object): 
    def __setattr__(self, name, value): 
     if name not in ('attr1', 'attr2', 'attr3', 'attr4'): 
      object.__setattr__(self, name, value) 
     else: 
      do_something_else() 
+1

Chào mừng bạn đến với Stack Exchange! Dưới đây là [hướng dẫn sự kiện lễ hội] của bạn (http://stackexchange.com/sites) – Aerovistae

+0

Tôi thường tránh các phương thức gọi trực tiếp trên 'đối tượng', ưu tiên sử dụng' super() 'thay thế. Một lý do là nó cho phép hợp tác đa thừa kế. Lớp 'object' sẽ vẫn được tham gia vào khóa học, vì đó là lớp cơ sở cuối cùng mà các cuộc gọi' super() 'cuối cùng sẽ đến được, nhưng bạn không cần đặt tên cho nó một cách rõ ràng. – Blckknght

+0

@Blckknght Tôi thường đồng ý với bạn về điều đó, tuy nhiên, trong trường hợp vi phạm đệ quy, tôi cũng thường cố gắng phá vỡ sự đệ quy gây ra bởi một siêu hạng (không hoạt động với các khung công tác vui nhộn?). Đây là trường hợp sử dụng một trong đó tôi (nói chung) sử dụng một cách rõ ràng đối tượng. – Tritium21