2010-10-22 41 views
13

Tôi đang viết một lớp chứa đựng bất kỳ đối tượng tùy ý nào, bao gồm các loại đơn giản. Tôi muốn từ khóa "là" hoạt động trên giá trị đóng gói, chẳng hạn như hành vi này:python: ghi đè lớp "là" hành vi

Wrapper(True) is True -> True 
Wrapper(False) is True -> False 
Wrapper(None) is None -> True 
Wrapper(1) is 1 -> True 

Có phương pháp đối tượng nào tôi có thể ghi đè để nhận hành vi này không?

Trả lời

24

No. is, andor không thể bị quá tải.

+0

Có phải trong tài liệu Python ở bất kỳ đâu không? Không thể tìm thấy bất cứ điều gì xác minh điều này. –

+4

Tham chiếu duy nhất là sự vắng mặt của chúng trong §3.4 của langref. http://docs.python.org/reference/datamodel.html#special-method-names –

+0

Câu trả lời này khá cũ. Điều này vẫn đúng cho các phiên bản Python mới nhất? –

2

Nói chung, nếu bạn muốn kiểm tra bình đẳng về mặt giá trị (nếu x là 1, hoặc Đúng, hoặc Không), bạn vẫn sử dụng toán tử ==. Nếu bạn muốn sử dụng toán tử is, bạn thường kiểm tra xem có điều gì đó đang đề cập đến cái gì khác, chẳng hạn như list1 is list2.

Nếu bạn muốn xác định hành vi đặc biệt cho ==, bạn có thể xác định __eq__ trong định nghĩa lớp học của mình.

-4

No. is, andor không thể bị quá tải.

Thật vậy. Tôi tin rằng các từ khóa được bảo lưu và không thể bị quá tải hoặc thay đổi.

Xem: "Các định danh sau đây được sử dụng như là từ dành riêng, hoặc từ khóa của ngôn ngữ, và không thể được sử dụng như bình thường định danh" http://docs.python.org/2/reference/lexical_analysis.html#keywords

Danh sách là: ['và', 'như', 'khẳng định', 'ngắt', 'lớp', 'tiếp tục', 'def', 'del', 'elif', 'else', 'ngoại trừ', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'hoặc ', 'vượt qua', 'in', 'tăng', 'trở lại', 'thử', 'trong khi', 'với', 'năng suất']

danh sách này có thể được xem qua các lệnh

keyword.kwlist

(Đừng quên nhập từ khóa đầu tiên)

Ngoài ra:

keyword.iskeyword ('là')

trả về true


Cập nhật:

câu trả lời của tôi là xấu và tôi nên cảm thấy xấu.

Tôi đã nhầm lẫn với bản thân mình. Tôi không biết tại sao tôi không chú ý đến điều đó ...

Lần thử thứ hai:

Tài liệu sau đây cung cấp danh sách đầy đủ các hành vi tùy biến trên lớp học. Điều này bao gồm tất cả các phương pháp để ghi đè và khai thác quá tải. 'is' không được bao gồm.

http://docs.python.org/2/reference/datamodel.html#special-method-names

Tốt nhất tôi có thể làm.

+0

Nhưng 'del' có thể được quá tải, ví dụ, bạn có thể quá tải' del x [i] 'hoặc 'del x.attr'. Câu hỏi đặt ra là liệu ngữ nghĩa có thể được thay đổi, không phải cú pháp. –

+0

'in' có thể bị quá tải trực tiếp. 'as' có thể bị quá tải một phần, trong một trình quản lý ngữ cảnh. 'import' và' for' có thể bị quá tải gián tiếp. –

+0

Bạn nên xóa các câu lệnh sai, cho đám đông tldr. – bukzor

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