__Getitem__ পদ্ধতি বোঝা


139

আমি __getitem__পাইথন ডক্সের বেশিরভাগ ডকুমেন্টেশনের মধ্য দিয়ে গিয়েছি , তবে আমি এখনও এর অর্থ বুঝতে পারি না।

সব তাই আমি যে বুঝতে পারেন __getitem__মত কল প্রয়োগ করতে ব্যবহৃত হয় self[key]। তবে এর ব্যবহার কী?

বলুন যে আমি একটি পাইথন ক্লাস এইভাবে সংজ্ঞায়িত করেছি:

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self,key):
        print ("Inside `__getitem__` method!")
        return getattr(self,key)

p = Person("Subhayan",32)
print (p["age"])

এটি প্রত্যাশিত ফলাফল প্রত্যাবর্তন করে। তবে কেন __getitem__প্রথম স্থানে ব্যবহার করবেন ? আমি শুনেছি পাইথন __getitem__অভ্যন্তরীণভাবে কল করে। তবে কেন এটি করে?

কেউ দয়া করে আরও বিস্তারিতভাবে ব্যাখ্যা করতে পারেন?


উদাহরণস্বরূপ ব্যবহারের জন্য এটি আগ্রহী হতে পারে: কীভাবে সঠিকভাবে সাবক্লাস ডিক করবেন এবং গেটিটেমসেটাইটেমকে
Rojoshosh

4
__getitem__আপনার উদাহরণে ব্যবহার ধারণা অনেক দেখা যায় না, কিন্তু মনে কর তুমি একটি কাস্টম তালিকা- বা অভিধান মত বর্গ লিখতে, বিদ্যমান কোডটি ব্যবহার সঙ্গে কাজ করার আছে প্রয়োজন []। এটি এমন একটি পরিস্থিতি যেখানে __getitem__দরকারী।
পিটার উইটভোয়েট

উত্তর:


158

কংগা মা কী __getitem__জন্য ব্যবহৃত হয় তা ব্যাখ্যা করার জন্য একটি ভাল কাজ করে - তবে আমি আপনাকে একটি উদাহরণ দিতে চাই যা কার্যকর হতে পারে। একটি শ্রেণীর কল্পনা করুন যা কোন বিল্ডিংয়ের মডেল। বিল্ডিংয়ের তথ্যের মধ্যে এটিতে প্রতিটি তল দখল করা সংস্থাগুলির বিবরণ সহ বেশ কয়েকটি বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে:

ব্যবহার না করে __getitem__আমাদের এই জাতীয় ক্লাস থাকবে:

class Building(object):
     def __init__(self, floors):
         self._floors = [None]*floors
     def occupy(self, floor_number, data):
          self._floors[floor_number] = data
     def get_floor_data(self, floor_number):
          return self._floors[floor_number]

building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print( building1.get_floor_data(2) )

তবে আমরা বিল্ডিং ক্লাসটি 'ভাল' ব্যবহার করতে __getitem__(এবং এর সমকক্ষ __setitem__) ব্যবহার করতে পারি।

class Building(object):
     def __init__(self, floors):
         self._floors = [None]*floors
     def __setitem__(self, floor_number, data):
          self._floors[floor_number] = data
     def __getitem__(self, floor_number):
          return self._floors[floor_number]

building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print( building1[2] )

আপনি __setitem__কীভাবে এই জাতীয় ব্যবহার করেন তা নির্ভর করে আপনি কীভাবে আপনার ডেটা বিমূর্ত করার পরিকল্পনা করছেন তার উপর নির্ভর করে - এক্ষেত্রে আমরা কোনও বিল্ডিংকে মেঝের ধারক হিসাবে বিবেচনা করার সিদ্ধান্ত নিয়েছি (এবং আপনি বিল্ডিংয়ের জন্য একটি পুনরুদ্ধারক প্রয়োগ করতে পারেন, এমনকি এমনকি টুকরো টুকরো করার ক্ষমতাও রয়েছে) - যেমন একবারে একাধিক তলার ডেটা পান - এটি আপনার প্রয়োজনের উপর নির্ভর করে।


15
উত্তরটি একাধিকবার পড়ার পরে আমি কেবল কিছু শিখেছি: একবার আপনার কাছে একটি গেটিটেম পরে আপনাকে স্পষ্টভাবে সেই ফাংশনটি কল করতে হবে না। যখন সে building1[2]এই কলটি নিজেই কল করে তখন অভ্যন্তরীণভাবে গিটাইটেমকে কল করে। সুতরাং @ টনি-প্রত্যোক -66 পয়েন্টটি বানাচ্ছে যে, শ্রেণীর যেকোন সম্পত্তি / ভেরিয়েবল কেবলমাত্র অবজেক্টনাম [ভেরিয়েবলের নাম] কল করে রান সময় পুনরুদ্ধার করা যায়। এটি প্রাথমিকভাবে পরিষ্কার ছিল না বলে এটি কেবল স্পষ্ট করা এবং এটি কারও সহায়তার আশায় এখানে লিখছি। অপ্রয়োজনীয় দয়া করে মুছুন
মিঠুনপল

3
@ মিঠুনপল বস্তু [সূচীকরণ] স্বরলিপিটি কোনও শ্রেণীর সম্পত্তি / ভেরিয়েবল / বৈশিষ্ট্য পেতে ব্যবহৃত হয় না - এটি একটি ধারক বস্তুর উপর নির্ভরযোগ্য নয় - উদাহরণস্বরূপ পিতামাতার কাছ থেকে কোনও শিশুকে পুনরুদ্ধার করা যেখানে অভিভাবক তার সন্তানের একটি তালিকা বজায় রাখে। আমার উদাহরণে - বিল্ডিং ক্লাসটি একটি ধারক (ফ্লোরের নামগুলির ক্ষেত্রে) তবে এটি মেঝে শ্রেণীর জন্য ধারক শ্রেণি হতে পারে।
টনি সাফলক 66

এটি সমর্থন করবে না বাদে len()এবং আপনি একটি পাবেন TypeError:TypeError: object of type 'Building' has no len()
সিয়াসটো পাইকার্জ

লেনকে সমর্থন করা (এবং অন্যান্য বৈশিষ্ট্য যেমন পুনরাবৃত্তি ইত্যাদি) আমার উদাহরণের উদ্দেশ্য নয়। একটি dender_len পদ্ধতি বাস্তবায়ন যদিও তুচ্ছ।
টনি সাফলক 66

@ টনিসফোকল66: এটি কি সঠিক যে ____len ____ আপনার উদাহরণে সূচক (মেঝে) এর জন্য পুনরাবৃত্তিটি নির্ধারণ করে কোন ____getitem____ লুপ?
অ্যালেক্স

73

[]কী বা সূচক দ্বারা আইটেমটি পাবার জন্য সিনট্যাক্স মাত্র বাক্য গঠন চিনি নেই।

আপনি যখন a[i]পাইথন কলগুলি মূল্যায়ন করেন a.__getitem__(i)(বা type(a).__getitem__(a, i), তবে এই পার্থক্যটি উত্তরাধিকারের মডেলগুলি সম্পর্কে এবং এটি এখানে গুরুত্বপূর্ণ নয়)। এমনকি যদি শ্রেণীর শ্রেণিগুলি aএই পদ্ধতিটি স্পষ্টভাবে সংজ্ঞায়িত না করে তবে এটি সাধারণত পূর্বপুরুষ শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

সমস্ত (পাইথন ২.7) বিশেষ পদ্ধতির নাম এবং তাদের শব্দার্থবিজ্ঞানগুলি এখানে তালিকাভুক্ত করা হয়েছে: https://docs.python.org/2.7/references/datamodel.html#spected- পদ্ধতিগত-নামসমূহ


8

__getitem__মূলত ম্যাজিক পদ্ধতিটি তালিকার আইটেমগুলি, অভিধানের প্রবেশপত্রগুলিতে, অ্যারের উপাদানগুলিতে অ্যাক্সেস করার জন্য ব্যবহৃত হয় instance

এখানে আমি এটি একটি উদাহরণ বর্গ ব্যক্তি দিয়ে দেখিয়ে যাচ্ছি যা 'নাম', 'বয়স' এবং 'দোব' (জন্ম তারিখ) দ্বারা ইনস্ট্যান্ট করা যায়। __getitem__পদ্ধতি একটি উপায় লেখা আছে যে এক ধরনের নাম বা পদবি, দিন, মাস বা DOB বছরের ইত্যাদি সূচীবদ্ধ উদাহরণস্বরূপ বৈশিষ্ট্যাবলী অ্যাক্সেস করতে পারেন

import copy

# Constants that can be used to index date of birth's Date-Month-Year
D = 0; M = 1; Y = -1

class Person(object):
    def __init__(self, name, age, dob):
        self.name = name
        self.age = age
        self.dob = dob

    def __getitem__(self, indx):
        print ("Calling __getitem__")
        p = copy.copy(self)

        p.name = p.name.split(" ")[indx]
        p.dob = p.dob[indx] # or, p.dob = p.dob.__getitem__(indx)
        return p

ধরুন একটি ব্যবহারকারীর ইনপুট নিম্নরূপ:

p = Person(name = 'Jonab Gutu', age = 20, dob=(1, 1, 1999))

সাহায্যে __getitem__পদ্ধতি, ব্যবহারকারী সূচীবদ্ধ বৈশিষ্ট্যাবলী অ্যাক্সেস করতে পারেন। যেমন,

print p[0].name # print first (or last) name
print p[Y].dob  # print (Date or Month or ) Year of the 'date of birth'

দুর্দান্ত উদাহরণ! আমি কিভাবে বাস্তবায়ন সম্পর্কে সব খোঁজের ছিল getitem যখন একাধিক প্যারামিটার হয় Init এবং আমি একটি সঠিক বাস্তবায়ন এটি এবং পরিশেষে তা দেখে সংগ্রাম ছিল! উত্সাহিত এবং আপনাকে ধন্যবাদ!
রাহুল পি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.