programing

__getitem__ 메서드에 대해서

luckcodes 2022. 12. 27. 22:00

__getitem__ 메서드에 대해서

나는 대부분의 문서를 검토했다.__getitem__Python 문서를 참조하고 있습니다만, 그 의미를 이해할 수 없습니다.

내가 할 수 은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아__getitem__ 、 음 、 음 、 is 、 is 、 like like like like like like like like 등의 합니다.self[key]데데그 ?슨 ?? ???

다음과 같이 정의된 python 클래스가 있다고 가정합니다.

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__?지만만 왜???

누가 좀 더 자세히 설명해 주시겠어요?

콩 마에 대해 잘 해 줍니다.__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__을 「으로 합니다를 사용하여 빌딩 클래스의 사용을 'nic'하게 합니다.

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__이는 데이터를 어떻게 추상화할 것인지에 따라 달라집니다.이 경우 건물을 층의 컨테이너로 취급하기로 결정했습니다(또한 빌딩의 반복기를 구현할 수도 있습니다.또한 한 번에 여러 층의 데이터를 얻을 수도 있습니다).필요에 따라 달라집니다.

[]키 또는 인덱스로 항목을 가져오는 구문은 구문설탕일 뿐입니다.

「 」를할 때a[i]이 Python을 a.__getitem__(i) (오류)type(a).__getitem__(a, i)그러나 이 구별은 상속 모델에 관한 것이므로 여기서는 중요하지 않습니다.)a는 이 메서드를 명시적으로 정의하지 않을 수 있습니다.보통 상위 클래스에서 상속됩니다.

(Python 2.7)의 모든 특수 메서드 이름과 그 의미는 다음과 같습니다.https://docs.python.org/2.7/reference/datamodel.html#special-method-names

의 방법 ★★★★★★★★★★★★★★★★★★」__getitem__는 기본적으로 목록 항목, 사전 항목, 배열 요소 등에 액세스하는 데 사용됩니다.인스턴스 속성을 빠르게 검색할 때 매우 유용합니다.

여기서는 '이름', '나이', '도브'(생년월일)로 인스턴스화할 수 있는 사람 클래스의 예를 보여 줍니다.__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

1개의 사용자 입력은 다음과 같습니다.

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'

하신 것처럼 Python의 메서드"던더 메서드"입니다.__getitem__기본 컨테이너 유형의 기능을 사용하여 컨테이너 개체를 개발할 수 있습니다.예를 들면, 실장__len__에서는, 그 「Built-in」에 수 .len .__setitem__ ★★★★★★★★★★★★★★★★★」__delitem__, 「」__getitem__그럼 컨테이너에서 작성, 치환, 갱신, 삭제 조작을 실행할 수 있습니다.

x[0] = "bork"  # calls __setitem__
y = x[0]  # calls __getitem__
del x[0]  # calls __delitem__

, 우선, 우선, 우선, 우선, 우선, 이런 것들이 .__getitem__dict'에 이미 가 포함되어 기존 을 한 것이 입니다.목적은 이미 기존 컨테이너에 과도하게 많은 수의 키와 값 쌍이 있거나 사전 값이 인터넷을 통해 배포되는 리소스인 경우 등 키와 값 쌍의 기존 컨테이너 간에 비용이 많이 들고 복잡한 해시 프로세스가 있는 사전을 한 번에 인스턴스화하는 것을 방지하는 것입니다.

두 가지가 있다고 가정해 보겠습니다.keys ★★★★★★★★★★★★★★★★★」values서 , ,,{k:v for k,v in zip(keys, values)}필요한 사전입니다.속도나 효율을 위해 게으르게 해야 합니다.

class LazyDict(dict):
    
    def __init__(self, keys, values):
        self.lazy_keys = keys
        self.lazy_values = values
        super().__init__()
        
    def __getitem__(self, key):
        if key not in self:
            try:
                i = self.lazy_keys.index(key)
                self.__setitem__(self.lazy_keys.pop(i), self.lazy_values.pop(i))
            except ValueError, IndexError:
                raise KeyError("%s not in map" % str(key))
        return super().__getitem__(key)

이것은 입력의 중복 키에 대해 가정하는 의도적인 예입니다.사전을 게으르게 하위 분류할 때는 항상 중복 키를 처리하기 위한 논리를 포함해야 합니다.

사용방법:

>>> a = [1,2,3,4]
>>> b = [1,2,2,3]
>>> c = LazyDict(a,b)
>>> c[1]
1
>>> c[4]
3
>>> c[2]
2
>>> c[3]
2
>>> d = LazyDict(a,b)
>>> d.items()
dict_items([])

가독성일관성을 추구합니다.이 질문은 연산자 오버로드가 존재하는 이유의 일부입니다.__getitem__이를 구현하는 기능 중 하나입니다.

클래스가 때, 그 세 번째 때, 미지의 클래스는 5번째 할 수 .obj[3] + obj[5]과가있있 있있있다다

연산자 과부하를 지원하지 않는 언어로 표현하면 그 선은 어떻게 보일까요? 마랄...... 같은 거...obj.get(3).add(obj.get(5)) 아니면?obj.index(3).plus(obj.index(5))

두 번째 접근법의 문제는 (1) 가독성이 훨씬 떨어지고 (2) 추측할 수 없을 정도로 문서를 찾아봐야 한다는 것입니다.

'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아!__getitem__method를 사용하면 오브젝트를 반복할 수 있습니다.

예: 와 함께 사용하는 경우iter() 수의 , 을 할 수 .int값을 제곱할 수 있습니다.

class MyIterable:
    def __getitem__(self, index):
        return index ** 2


obj = MyIterable()
obj_iter = iter(obj)

for i in range(1000):
    print(next(obj_iter))

이 기술을 사용하는 일반적인 라이브러리는 '이메일' 모듈입니다., 이렇게 요.__getitem__email.message.MessageMIME을 사용합니다.

그런 다음 및 에서 올바른 기본값을 가진 유효한 MIME 유형 메시지를 가져오려면 머리글만 추가하면 됩니다.후드 아래에서 더 많은 일들이 일어나고 있지만 사용법은 간단하다.

message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject

는 장고코어를 있다.__getitem__하다

  1. 장고 HTTP 요구

    • /POST에 됩니다.request를 제기하다request.GET/request.POSTdict. 이 dict는 MultiValueDict에서 상속되는 QueryDict 유형입니다.

    • 때, 라고 말하세요.user_id=42QueryDict는 다음과 같이 저장/표시됩니다.

      <QueryDict: {'user_id': ['42']}>

      그래서 전달된 데이터는

      'user_id': ['42']

      직감적인 대신

      'user_id': '42'

      MultiValueDictdocstring에서는 목록 형식으로 자동 갱신할 필요가 있는 이유를 설명합니다.

      이 클래스는 모든 키에 대한 목록을 반환하는 cgi.parse_qs에 의해 발생하는 성가신 문제를 해결하기 위해 존재합니다.

    • 경우,QueryDict입니다).이러한 방법으로 액세스 할 필요가 있습니다(같은 아이디어입니다).request.GET

      • request.POST['user_id'][0]

      • request.POST['user_id'][-1]

      • request.POST.get('user_id')[0]

      • request.POST.get('user_id)[-1]

        하지만, 이것들은 데이터에 접근하는 끔찍한 방법들이다.장고는 '장고'보다 '장고'를 __getitem__ ★★★★★★★★★★★★★★★★★」__get__MultiValueDict은 다음과 같습니다 하다

        def __getitem__(self, key):
            """
            Accesses the list value automatically 
            using the `-1` list index.
            """
            list_ = super().__getitem__(key)
            return list_[-1]
        
        def get(self, key, default=None):
            """
            Just calls the `__getitem__` above.
            """
            return self[key]
        

        이를 통해 보다 직관적인 액세스 권한을 얻을 수 있습니다.

        • request.POST['user_id']
        • request.POST.get('user_id')
  2. 장고 양식

    • 할 수 .ModelForm

      class ArticleForm(...):
          title = ...
      
    • 이러한 폼은 BaseForm에서 상속되며 다음과 같은 magic 메서드(간소화 버전)를 덮어씁니다.

      def __iter__(self):
         for name in self.fields:
             yield self[name]
      
      def __getitem__(self, name):
          return self.fields[name]
      

      다음과 같은 편리한 패턴을 얻을 수 있습니다.

      # Instead of `for field in form.fields`.
      # This is a common pattern in Django templates.
      for field in form
          ...
      
      # Instead of `title = form.fields['title']`
      title = form['title']
      

요약하자면, 마법의 방법(또는 그 재정의)은 코드 가독성과 개발자 경험/편의성을 높입니다.

언급URL : https://stackoverflow.com/questions/43627405/understanding-getitem-method