পাইথনের 'ইন' অপারেটরকে ওভাররাইড করবেন?


197

যদি আমি পাইথনে আমার নিজস্ব ক্লাস তৈরি করছি, তবে 'ইন' অপারেটর ব্যবহারের অনুমতি দেওয়ার জন্য আমার কোন ক্রিয়াকলাপটি সংজ্ঞায়িত করা উচিত?

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। (
বিদ্রূপ

উত্তর:



191

আরও একটি সম্পূর্ণ উত্তর হ'ল:

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__ দেখুন ।


@ পেথুলিন, আপনার কোডের ক্ষেত্রে "আরও সম্পূর্ণ" হতে পারে তবে ডকুমেন্টেশনের সাথে ইগনাসিওর লিঙ্কগুলি কারও কারও কাছে সর্বদা বড় প্লাস।
পিটার হানসেন

16
@PEter। হ্যাঁ, তবে আমরা কেউ কেউ উত্তরের একটি সুন্দর, চাক্ষুষ উপস্থাপনা পছন্দ করি। ইগনাসিও গুগলের পরিবর্তে প্রথমে আমাদের এখানে সরাসরি নির্দেশনা দেওয়া ব্যতীত অন্য প্রশ্নটির উপকারে খুব কমই পারেন, আপনাকে ধন্যবাদ না no
জোড়ান পাভলভিক

জোড়ান, আমি সম্মত, এবং আমি এমনকি এই উত্তরটিকে সমর্থন করেছি এবং অন্যটিও নয়। আমি কেবল ইঙ্গিত করছি যে সত্যিকারের ভাল উত্তরটি সর্বদা ডক্সের সাথে লিঙ্ক করা উচিত, যদি পাওয়া যায়।
পিটার হানসেন

13
সমস্ত, লিঙ্কগুলি মারা যায় এবং এজন্যই ইগনাসিওর উত্তর এসও-তে নড়বড়ে। লিঙ্কগুলি + উদাহরণ সর্বোত্তম এবং সে কারণেই আমরা যে দুটি উত্তরের বিষয়ে কথা বলছি তার সংমিশ্রণ সবচেয়ে ভাল।
ডেমোঙ্গোলেম

1
@ ডেমোঙ্গোলেম সরকারী পাইথন ডকুমেন্টেশন দোভাষী দাবীযোগ্য ও ডাউনলোডযোগ্য হয়ে যাওয়ার পরে বা মারা যাবে die এবং এটি কোনও লিঙ্ক-কেবল উত্তর নয়; আমি উত্তরটি অনুসন্ধান করতে এই পৃষ্ঠায় এসেছি এবং কোনও লিঙ্কে ক্লিক না করে এটি পেয়েছি (যেমন প্রোটোটাইপ যথেষ্ট ছিল)। আমি নীতিগতভাবে একমত, কিন্তু imho যে এখানে প্রযোজ্য না।
wizzwizz4

7

আপনি কোনও ইনফিক্স অপারেটর ওভাররাইড ফ্রেমওয়ার্কটি একবার দেখে নিতে চাইতে পারেন যে আমি কোনও ডোমেন-নির্দিষ্ট ভাষা তৈরি করতে সক্ষম হয়েছি:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.