2014-04-06 6 views
1

사람들은 getter 및 setter를 Pythonic으로 생각하지 않고 대신 @property을 사용하는 경향이 있습니다. 나는이 처리하는 헬퍼 클래스를 만들 수 있습니다, 물론dict-style setter에 대한 Pythonic 대안?

class OldMyClass(object): 
    @property 
    def foo(self): 
     return self._foo 

    @foo.setter 
    def foo(self, value): 
     self.side_effect(value) 
     self._foo = value 

class NewMyClass(object): 
    @property 
    def foo(self, key): # Invalid Python 
     return self._foo[key] 

    @foo.setter 
    def foo(self, key, value): # Invalid Python 
     self.side_effect(key, value) 
     self._foo[key] = value 

하지만, 그것은 단지 세터/게터를 작성하는 것 같아 : 저는 현재 딕셔너리를 지원하기 위해 @property를 사용하는 클래스의 기능을 확장하기 위해 노력하고있어 키와 값을 취하는 함수는 훨씬 간단합니다. 하지만이 리팩터링을하기위한 더 파이썬 적 방법이 있습니까?

+0

나는 당신의 질문을 이해하지 못합니다. 'foo.setter' 란 무엇입니까? 일반적으로 이전에'foo'라는 게터를 정의한 경우에만 작동합니다. 또한 결과 객체를 어떻게 사용하려고합니까? '열쇠'는 어떻게 사용되어야 하는가? – BrenBarn

+0

그래, 나는 그것이 정말로 적절하다고 생각하지 않았기 때문에 getter를 포함하지 않았다. 나는 그것을 명료하게 추가 할 것이다. 어떻게 결과 객체를 사용하려고하는지에 대한 질문을 이해할 수 없습니다. –

+0

키/값을 설정하는 데 사용할 코드는 무엇입니까? 보통의 프로퍼티를 사용하면'obj.prop = value'를 할 것입니다. 대신에 무엇을하고 싶니? – BrenBarn

답변

4

설명하는 것은 속성의 대소 문자가 아닙니다. 속성은 의 동작을 사용자 정의하기 위해 obj (또는 그 클래스)을 허용하기위한 것입니다. obj.prop[key] = value을 사용자 정의하려면 obj이 아닌 obj.prop에 처리해야합니다. 즉, obj.prop을 사용자 정의 클래스로 만들어야합니다. 원하는 것은 __setitem__으로 맞춤 클래스를 만드는 것입니다. 당신의 MyClass에의 __init__self.foo = Foo()을 할 수있는 그런

class Foo(object): 
    def __init__(self): 
     self._vals = {} 

    def __setitem__(self, key, val): 
     do_side_effect(key, val) 
     self._vals[key] = val 

. 당신은 부작용이 부모에 이루어져야하기 때문에 부모 개체가, 예를 들어, (무엇인지 알고이 DICT 같은 객체를 원하는 경우

후 푸에 인수로 부모를 전달합니다

class Foo(object): 
    def __init__(self, parent): 
     self.parent = parent 
     self._vals = {} 

    def __setitem__(self, key, val): 
     parent.do_side_effect(key, val) 
     self._vals[key] = val 

그리고 MyClass.__init__ 당신은 self.foo = Foo(self)을한다.

게터/세터에 관해서는, 당신이하고있는 것은 전형적인 게터/세터 없습니다. 낙심되는 일의 종류가있다 getSomeProp()setSomeProp(value), 같은 것들입니다 당신이 얻는/설정하는 각 속성에 대해 별도의 메소드. 예를 들어, 당신은 키 - 값 쌍을 설정하기위한 일반화 된 get/set 메커니즘 인 (오브젝트의 행동에 대한 의미를 갖는) 다른 무언가를 설명하고 있습니다. 메소드 setPair(key, value)을 갖는 것은 doSomething(arg1, arg2)이라는 메소드를 갖는 것보다 나쁘지 않습니다. 여기에 추가 매개 변수가 있으므로 작업이 obj.key = value의 간단한 패턴에 맞지 않습니다. obj.prop[key] = value의 키/값을 "알기"위해 obj을 추가하려면 간접 지정 계층이 추가로 필요합니다. obj.prop[key] = value과 같은 할당에서 키와 값은 obj에서 제거 된 한 단계이며 직접 prop과 만 상호 작용합니다.

또한 John Smith Optional에서 제안하는 간단한 방법을 사용하여 수행 할 수도 있습니다. 이러한 방식으로 수행하든 또는 설명 된 맞춤 개체를 사용하든 상관없이 API 설정 방법에 따라 다릅니다. 여기에 설명 된 것과 같이 사용자 정의 "데이터 보유"클래스를 기반으로 작성된 코드는 가독성 이점을 가질 수 있지만 구현이 좀 더 복잡해집니다.

+0

이것은 매우 유용하고 명확한 설명입니다. – mhucka