Ghi đè toán tử 'in' của Python?


197

Nếu tôi đang tạo lớp riêng của mình trong Python, tôi nên xác định hàm nào để cho phép sử dụng toán tử 'in', vd

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

Tôi đã thực sự tìm kiếm cách ghi đè các toán tử isis nottoán tử. Giống như một query = tinydb.Query().field == value, để cũng có thể viết Query().field is not None. Nhưng có vẻ như tôi còn lại __eq____ne__trong thời gian này, điều này dẫn đến sự không lành mạnh Query().field != None. (mỉa mai)
Tomasz Gandor

Câu trả lời:



191

Một câu trả lời đầy đủ hơn là:

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

Ở đây bạn sẽ nhận được True khi hỏi nếu 54 trong m:

>>> m = MyClass()
>>> 54 in m
True  

Xem tài liệu về quá tải__contains__ .


@pthulin, của bạn có thể "hoàn thiện hơn" về mặt mã, nhưng các liên kết của Ignacio đến tài liệu, đây luôn là điểm cộng lớn cho một số người.
Peter Hansen

16
@PEter. YEah, nhưng một số người trong chúng ta thích một đại diện trực quan tốt đẹp của câu trả lời. Ignacio's đã làm rất ít để có lợi cho câu hỏi ngoài việc hướng dẫn chúng tôi ở đây trước thay vì google, không cảm ơn bạn.
Zoran Pavlovic

Zoran, tôi đồng ý, và tôi thậm chí còn đưa ra câu trả lời này chứ không phải câu trả lời khác. Tôi chỉ chỉ ra rằng một câu trả lời thực sự tốt nên luôn luôn liên kết đến các tài liệu, nếu có sẵn.
Peter Hansen

13
Tất cả, các liên kết đều chết và đó là lý do tại sao câu trả lời của Ignacio không ổn định trên SO. Liên kết + ví dụ là tốt nhất và đó là lý do tại sao sự kết hợp của hai câu trả lời mà chúng ta đang nói đến là tốt nhất.
demongolem

1
@demongolem Tài liệu Python chính thức sẽ chết cùng hoặc sau khi trình thông dịch không thể tải xuống. Và nó không phải là một câu trả lời chỉ liên kết; Tôi đến trang này để tìm câu trả lời và tìm thấy nó mà không cần nhấp vào bất kỳ liên kết nào nữa (tức là nguyên mẫu là đủ). Tôi đồng ý về nguyên tắc, nhưng imho không áp dụng ở đây.
wizzwizz4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.