अजगर के 'इन' ऑपरेटर को ओवरराइड करें?


199

यदि मैं पायथन में अपनी खुद की कक्षा बना रहा हूं, तो मुझे किस फ़ंक्शन को परिभाषित करना चाहिए ताकि 'इन' ऑपरेटर के उपयोग की अनुमति मिल सके।

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

मैं वास्तव में खोज रहा था कि कैसे isऔर is notऑपरेटरों को ओवरराइड किया जाए । ए की तरह query = tinydb.Query().field == value, लिखने में भी सक्षम हो Query().field is not None। लेकिन ऐसा लगता है कि मैं कुछ समय के लिए __eq__और साथ छोड़ दिया गया हूं __ne__, जो कि unpythonic की ओर जाता है Query().field != None। (सार्क)
टॉमस गैंडर

जवाबों:



193

एक और पूर्ण उत्तर है:

class MyClass(object):

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

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

जब 54 मीटर था, तो यहां आपको यह सच है कि:

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

ओवरलोडिंग पर प्रलेखन__contains__ देखें ।


@pthulin, आपका कोड के मामले में "अधिक पूर्ण" हो सकता है, लेकिन इग्नासियो के प्रलेखन के लिंक, जो हमेशा कुछ के लिए एक बड़ा प्लस है।
पीटर हैनसेन

16
@PEter। हाँ, लेकिन हम में से कुछ जवाब का एक अच्छा, दृश्य प्रतिनिधित्व पसंद करते हैं। इग्नासियो ने हमें सीधे गूगल के बजाय यहां सीधे सवाल के अलावा कुछ भी लाभ नहीं दिया, धन्यवाद।
ज़ोरान पावलोविक

ज़ोरान, मैं सहमत हूँ, और मैंने इस उत्तर को भी छोड़ दिया और दूसरे को नहीं। मैं सिर्फ यह इंगित कर रहा हूं कि एक अच्छा जवाब हमेशा डॉक्स से लिंक होना चाहिए, यदि उपलब्ध हो।
पीटर हैन्सन

13
सभी, लिंक मर जाते हैं और यही कारण है कि इग्नासियो का जवाब एसओ पर अस्थिर है। लिंक्स + उदाहरण सबसे अच्छा है और इसीलिए हम जिन दो उत्तरों के बारे में बात कर रहे हैं उनमें से एक संयोजन सबसे अच्छा है।
डेमॉन्गोलम

1
@demongolem इंटरप्रेटर के डाउनलोड होने के बाद या उसके बाद आधिकारिक पायथन प्रलेखन मर जाएगा। और यह केवल लिंक का उत्तर नहीं है; मैं उत्तर की तलाश में इस पृष्ठ पर आया और बिना किसी और लिंक पर क्लिक किए इसे पाया (यानी प्रोटोटाइप पर्याप्त था)। मैं सिद्धांत रूप में सहमत हूँ, लेकिन यहाँ जो लागू नहीं होता है।
wizzwizz4

7

तुम भी एक infix ऑपरेटर ओवरराइड ढांचे पर एक नज़र रखना चाह सकते हैं जो मैं एक डोमेन-विशिष्ट भाषा बनाने के लिए उपयोग करने में सक्षम था:

http://code.activestate.com/recipes/384122/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.