2009-04-21 4 views
4

python이 sorted()에 전달 된 메소드를 처리하는 방법에 대한 질문이 있습니다.python3은 sorted()의 "key"인수에 전달 된 메서드로 무엇을합니까?

X: 1 Y: 5 
X: 1 Y: 6 
X: 1 Y: 5 
X: 2 Y: 8 
X: 2 Y: 1 
X: 3 Y: 6 
X: 4 Y: 2 
X: 5 Y: 4 
X: 6 Y: 2 
X: 8 Y: 0 

이 스크립트는 각 인스턴스의 X 필드의 값에 따라 SortClass 객체를 정렬합니다

#!/usr/bin/env python3 

import random 

class SortClass: 
    def __init__(self): 
     self.x = random.choice(range(10)) 
     self.y = random.choice(range(10)) 
    def getX(self): 
     return self.x 
    def getY(self): 
     return self.y 

if __name__ == "__main__": 
    sortList = [SortClass() for i in range(10)] 
    sortedList = sorted(sortList, key = SortClass.getX) 
    for object in sortedList: 
     print("X:", object.getX(),"Y:",object.getY()) 

다음과 유사한 출력을 제공 : 다음과 같은 작은 스크립트를 고려하십시오. 그러나 Sorted의 "key"인수는 SortClass의 특정 인스턴스가 아니라 SortClass.getX를 가리킨다는 점에 유의하십시오. 파이썬이 실제로 "키"로 전달 된 메서드를 실제로 사용하는 방법에 대해서는 약간 혼란 스럽습니다. 전달 된 객체가 "self"인수와 동일한 유형이기 때문에 getX()를이 작업과 같이 호출합니까? 이것은 "핵심"논쟁의 안전한 사용인가?

+1

참고 : 당신은 Python으로 정렬 마스터하려면

는 또한, 정렬 하우투를 읽어 보시기 바랍니다. 대신 operator.attrgetter를 써야합니다. 여기 예제 : http://dpaste.com/hold/36126/ – nosklo

+0

내 말은 'sortList = [Sortin] (범위 내 (10)에 대한)]' –

답변

8

클래스의 메소드는 단지 함수 일뿐입니다.

class MyClass(object): 
...  def my_method(self): pass 
... 
>>> MyClass.my_method 
<function my_method at 0x661c38> 

당신이 클래스의 인스턴스의 메소드를 가져, 파이썬은 바인딩 된 메서드를 반환하는 마법 (라고 설명)를 사용합니다. 바운드 메소드는 호출 될 때 인스턴스를 첫 번째 인수로 자동 삽입합니다. 당신이 발견 한 것처럼

>>> MyClass().my_method 
<bound method MyClass.my_method of <__main__.myClass object at 0x6e2498>> 

그러나, 당신은 또한 직접 첫 번째 인수로 인스턴스와 함수를 호출 할 수 있습니다 sorted() 일어나고 무엇 MyClass.my_method(MyClass())

합니다. 파이썬은 SortedClass.getx 함수를 SortedClass의 인스턴스가되는 목록의 항목과 함께 호출합니다.

은 (그건 그렇고, getX 같은 속성을 노출하는 방법을 사용하지 않는 모든의. 첫째을하고 일을 더 나은 방법이 있습니다. 속성이나 일반 속성을 사용합니다. 또한, operator.itemgetteroperator.methodcaller 봐.)

관련 문제