Mengesampingkan operator 'dalam' Python?


197

Jika saya membuat kelas saya sendiri dengan Python, fungsi apa yang harus saya definisikan sehingga memungkinkan penggunaan operator 'in', misalnya

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

Saya sebenarnya mencari cara menimpa isdan is notoperator. Seperti query = tinydb.Query().field == value, juga bisa menulis Query().field is not None. Tapi sepertinya saya pergi dengan __eq__dan __ne__untuk saat ini, yang mengarah ke unpythonic Query().field != None. (sarc)
Tomasz Gandor

Jawaban:



191

Jawaban yang lebih lengkap adalah:

class MyClass(object):

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

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

Di sini Anda akan mendapatkan Benar ketika menanyakan apakah 54 berada di m:

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

Lihat dokumentasi tentang kelebihan muatan__contains__ .


@ pthulin, milik Anda mungkin "lebih lengkap" dalam hal kode, tetapi tautan Ignacio ke dokumentasi, yang selalu merupakan nilai tambah besar bagi sebagian orang.
Peter Hansen

16
@ Mail. Ya, tetapi beberapa dari kita lebih suka representasi visual yang bagus dari jawabannya. Ignacio's tidak banyak memberi manfaat pada pertanyaan selain mengarahkan kami ke sini terlebih dahulu alih-alih google, tidak, terima kasih.
Zoran Pavlovic

Zoran, aku setuju, dan aku bahkan mengangkat jawaban ini dan bukan yang lain. Saya hanya menunjukkan bahwa jawaban yang benar-benar baik harus selalu ditautkan ke dokumen, jika tersedia.
Peter Hansen

13
Semua, tautan mati dan itulah sebabnya jawaban Ignacio goyah pada SO. Tautan + contoh adalah yang terbaik dan itulah sebabnya kombinasi dari dua jawaban yang kita bicarakan adalah yang terbaik.
demongolem

1
@demongolem Dokumentasi Python resmi akan mati dengan atau setelah penerjemah menjadi tidak dapat diunduh. Dan itu bukan jawaban tautan saja; Saya datang ke halaman ini untuk mencari jawabannya dan menemukannya tanpa mengklik tautan apa pun (mis. Prototipe sudah mencukupi). Saya setuju secara prinsip, tapi itu tidak berlaku di sini.
wizzwizz4

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.