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:
    ...
astrofrog
sumber
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
sumber
@ 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