2012-09-05 2 views
0

는 파이썬 마법 방법을 공부했습니다, 그리고 특정 작업을 간략하게 설명 할 수있는 방법이 있는지 궁금되었습니다 대개체 할당을 나타내는 방법은 무엇입니까? , 그 아마도 의미에서</p> <pre><code>MyClass(*params).method() </code></pre> <p>:

a = MyClass(*params).method() 

'\n' 문자 그대로 나뉘어 진 목록을 반환하는 대신 원시 목록을 a 변수로 덤프하여 '\n' 그대로 유지할 수 있습니다.

파이썬에게 다음 액션이 변수에 값을 반환하려고 할 때, 그리고 그 경우에는 액션을 변경할지 묻는 방법이 있습니까? 나는 생각하고 있었다 :

class MyClass(object): 
    def __init__(params): 
     self.end = self.method(*params) 

    def __asgn__(self): 
     return self.method(*params).split('\n') 

    def __str__(self): 
     """this is the fallback if __asgn__ is not called""" 
     return self.method(*params) 

답변

4

아니오 베어드 이름을 지정할 때 일어나는 일을 변경할 수 없다.

왼쪽의 할당 대상이 개체의 특성 또는 항목 인 경우 어떻게됩니까? a[blah] = ...__setitem__으로, a.blah = ...__setattr__으로 바꿀 수 있습니다 (할당하려는 개체가 아니라 a에만 연결할 수 있음). 하지만 무시하거나 어떤 식 으로든 영향을받을 수는 없습니다 a = ....

오른쪽을으로 변경하면 "일어날 것"에 따라 손을 바꾸는 것이 더 낯설고 매우 나쁩니다. 즉

someFunc(MyClass().method()) 

파이썬 이름에서

a = MyClass().method() 
someFunc(a) 

단지 객체에 부착 된 라벨 (label)보다 다를 수 있음을 의미한다. 객체는 어떤 레이블이 부착되어 있는지 알지 못합니다. 이는 좋은 것입니다. 결과를 중간 변수에 할당하면 후속 행을보다 쉽게 ​​읽을 수 있고 해당 할당이 해당 계산의 결과를 변경하지 않도록 할 수 있습니다.

+0

당신을 수행 실용적인 * 사용법을 참조 하시겠습니까? 아니면 파이썬 중위 계급에서 일하고 있습니까? ';)' – Droogans

+0

당신은 + 연산자를 할당이나 무언가처럼 기능하도록 변경할 수 있습니다 ... 매우 권장하지는 않지만 ...'a + "hello world"는'a' 인스턴스를 변경할 수 있습니다 ... 유지해야하는 사람의 정신을 위해서 ... –

+0

@JoranBeasley 오 ... 아니, 아니, 아니, 아니, 아니. 확립 된 것이 있거나 그렇지 않은 이유를 찾는다.홈 양조 된 바로 가기는 솔로 아티스트에게 맡기는 것이 가장 좋습니다. – Droogans

0

아니요을 직접 호출하여 MyClass(*params).method()을 호출하여 변수에 할당해야합니다. 여기서 볼 수있는 것은 인터프리터가 자동으로 결과를 출력하므로 변수 값에 EOL 마커가 포함되어있는 동안 분리 된 것처럼 보이는 이유입니다.

변수에 대한 기본 할당을 재정의 할 수있는 방법이 없습니다. 그러나 개체를 사용하여, 당신은 쉽게 자신의 후크를 제공 할 수 있습니다 : 다음

class Assigner(object): 
    def __init__(self, assignment_callback): 
     self.assignment = assignment_callback 

    def __setattr__(self, key, value): 
     if hasattr(self, 'assignment'): 
      value = self.assignment(value) 
     super(Assigner, self).__setattr__(key, value)  

def uppercase(value): 
    # example function to perform on each attribute assignment 
    return value.upper() 

을 코드에서 직접 당신이 개체의 특성에 할당하지 않고 변수에 할당하는 것보다 :

>>> my = Assigner(uppercase) 
>>> my.a = 'foo' 
>>> print my.a 
FOO