__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.Message
MIME을 사용합니다.
그런 다음 및 에서 올바른 기본값을 가진 유효한 MIME 유형 메시지를 가져오려면 머리글만 추가하면 됩니다.후드 아래에서 더 많은 일들이 일어나고 있지만 사용법은 간단하다.
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
는 장고코어를 있다.__getitem__
하다
장고 HTTP 요구
/POST에 됩니다.
request
를 제기하다request.GET
/request.POST
dict. 이 dict는 MultiValueDict에서 상속되는 QueryDict 유형입니다.때, 라고 말하세요.
user_id=42
QueryDict는 다음과 같이 저장/표시됩니다.<QueryDict: {'user_id': ['42']}>
그래서 전달된 데이터는
'user_id': ['42']
직감적인 대신
'user_id': '42'
MultiValueDict
의 docstring에서는 목록 형식으로 자동 갱신할 필요가 있는 이유를 설명합니다.이 클래스는 모든 키에 대한 목록을 반환하는 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')
장고 양식
할 수 .
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
'programing' 카테고리의 다른 글
이클립스에서 Java 프로그램을 실행하지 않고 컴파일하려면 어떻게 해야 하나요? (0) | 2022.12.27 |
---|---|
SQL 파일을 mysql로 가져오기 (0) | 2022.12.27 |
자바 제네릭스의 &과 '의 차이점은 무엇입니까? (0) | 2022.12.27 |
C에 정원이 있나요? (0) | 2022.12.27 |
mysql의 현재 날짜에서 30일을 빼려면 어떻게 해야 하나요? (0) | 2022.11.27 |