2011-08-09 2 views
1

파이썬 사례 : "참조"에 의해 전달 된 인수

클래스의 인스턴스를 생각해 보자 :

class Car(object): 
    def __init__(self): 
     self.engine = None 

그리고 그 인스턴스를 수정하는 함수 :

def add_engine(car): 
    car.engine = 'V6' 

파이썬은 인수가 수정된다는 암시 적 기술을 가지고 있지 않다. 내가 생각할 수있는 최선의 해결책은 수정 된 객체를 반환하는 것입니다 (동일한 객체가 인수로 전달 되더라도).

def add_engine(car): 
    car.engine = 'V6' 
    return car 

이 설계 문제는 어떻게 해결할 수 있습니까?

-

얘들 아, 답변 해 주셔서 대단히 감사합니다. 귀하의 조언은 내 머리에 혼란을 지우는 데 도움이 :)

답변

4

나는 이러한 것들을 self으로 반환하는 경향이 있습니다. 그럴 수 있습니다.

car = Car().add_engine().add_wheels() 

다른 옵션은 때때로 Python 표준 라이브러리에서 사용되는 것으로 반환하지 않습니다. 그것은 혼란을 방지하고 파괴적인 업데이트를 사용할 때 클라이언트에게 명령형을 강요하기로되어 있습니다. list.sortsorted의 예입니다.

선택은 스타일 중 하나이므로 주변 코드와의 일관성에 대한 일반적인 규칙이 적용됩니다.

+1

Downvoters, 설명해 주시겠습니까? –

2

나는 완전히 다르게 해결할 :

class Car(object): 
    def __init__(self): 
     self.engine = None 

    def set_engine(self): 
     self.engine = 'V6' 

협약이 add 데이터를 추가한다는 것입니다; set은 기존 상태를 변경합니다. @larsmans가 지적한대로 자동차를 반환하면 매력적인 구조가되지만 문제를 해결하지는 못합니다.

2

파이썬은 C++, Java, C# 등이 아닙니다. 여러분이 좋아할만한 것을 할 수 있습니다. 비공개로 설정할 수는 없습니다. 당신은 constenceness를 강제 할 수 없다.

파이썬의 이러한 측면에는 장점과 단점이 있지만 그 방법이 있습니다. 정적으로 검사 할 수있는 것이 거의 없으므로 우수한 적용 범위로 코드에 대한 매우 강력한 런타임 테스트가 필요합니다. 완전한 테스트 커버리지가없는 강력한 테스트가 없다면 Python으로 개발하는 것이 고양이를 방목하는 것과 조금 다를 수 있습니다.

0

당신은 __setattr__ 방법 지정 속성을 재정의 할 수 있습니다 : 이제 car_modified은 당신이 속성을 설정 때마다 호출됩니다

class Car(object): 
    def __init__(self): 
     self.engine = None 
    def car_modified(self, name): 
     #do whatever you want 
    def __setattr__(self, name, value) 
     self.__dict__[name] = value 
     self.car_modified(name) 

.

+0

원래 값을 반환하는 것과 값을 반환하지 않는 것에 대한 대답은 어떻게됩니까? –

+0

@larsmans, "파이썬은 인수가 수정된다는 암시 적 기술을 가지고 있지 않습니다." 속성 할당시 알림을받을 수 있습니다. 나는 이것이 그 문제의 일부라고 생각한다. – utdemir

7

FWIW, 나는 파이썬 세계에서 부작용이있는 함수/메서드 (예 : 묻는 중 하나와 같은)가 항상 None을 반환한다는 것을 알아 냈습니다. (이것은 인수없이 return 문을 사용하거나 return을 완전히 생략하여 암시 적으로 수행됩니다.예를 들어)

이 경우 목록이 위치에 정렬되어 있기 때문에, None를 반환 list.sort 방법으로, 새 목록 (물론, 분류를) 반환 sorted 내장 함수를 비교합니다. 유사한 상황이 reversed 내장 함수와 list.reverse 메소드의 경우에도 적용됩니다.

그러므로 IMO는 함수 (암시 적으로)를 None으로 돌려 주면 함수에 부작용이 있다는 사실을 사용자에게 알리는 데 충분합니다 (부작용없이 항상 None을 반환하는 함수는 기본적으로 no-op)를 전통적인 "Pythonic"방식으로 사용합니다.

+1

+1하지만 투표에서 제외됩니다. 이것은 @CatPlusPlus와 같은 대답을주는 유용한 방법입니다. 이것은 부작용/장소에서 작동하는 파이썬 메소드가하는 일입니다. – agf