python - Python 속성을 사용한 특성 매핑

기사 출처 python

Python @property를 setter와 getter로 한 번에 모두 작동하도록 만드는 방법이 있습니까?

나는 전에 어딘가에서 이것을 본 것처럼 느껴지지만 기억할 수 없으며 직접 솔루션을 다시 만들 수 없습니다.

예를 들어 다음 대신 :

class A(object):
  def __init__(self, b): self.b = b
  def get_c(self): return self.b.c
  def set_c(self, value): self.b.c = value
  c = property(get_c, set_c)


A 객체의 경우 c 속성이 getter, setter (원하는 경우 deleter)의 b.c와 실제로 동일하다는 신호를 보낼 수 있습니다.

자극:

이는 A 객체 (B가 인스턴스 임) 주위의 프록시 래퍼가되어야하지만 데이터 속성 만 공유하고 메서드는 공유하지 않도록 b가 필요할 때 특히 유용합니다. 이와 같은 속성을 사용하면 AB 개체의 데이터가 동일한 코드에서 사용되는 동안 완전히 동기화 상태를 유지할 수 있습니다.
ActiveState에 게시 된대로 this forwardTo class를 찾고있는 것 같습니다.


이 레시피를 사용하면 속성 액세스를 다른
수업에서 개체. 이렇게하면 일부
클래스 인스턴스의 멤버 직접, 예 : foo.baz () 대신
foo.bar.baz ().


class forwardTo(object):
    """
    A descriptor based recipe that makes it possible to write shorthands
    that forward attribute access from one object onto another.

    >>> class C(object):
    ...     def __init__(self):
    ...         class CC(object):
    ...             def xx(self, extra):
    ...                 return 100 + extra
    ...             foo = 42
    ...         self.cc = CC()
    ...
    ...     localcc = forwardTo('cc', 'xx')
    ...     localfoo = forwardTo('cc', 'foo')
    ...
    >>> print C().localcc(10)
    110
    >>> print C().localfoo
    42

    Arguments: objectName - name of the attribute containing the second object.
               attrName - name of the attribute in the second object.
    Returns:   An object that will forward any calls as described above.
    """
    def __init__(self, objectName, attrName):
        self.objectName = objectName
        self.attrName = attrName
    def __get__(self, instance, owner=None):
        return getattr(getattr(instance, self.objectName), self.attrName)
    def __set__(self, instance, value):
        setattr(getattr(instance, self.objectName), self.attrName, value)
    def __delete__(self, instance):
        delattr(getattr(instance, self.objectName), self.attrName)


보다 강력한 코드를 위해 getattr(instance, self.objectName)operator.attrgetter(self.objectName)(instance)로 바꾸는 것이 좋습니다. 이렇게하면 objectName가 점으로 구분 된 이름이 될 수 있습니다 (예 : A.cA.x.y.z.d의 프록시가 될 수 있음).

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/14167675/

관련 기사
python - TypeError : 'str'개체를 호출 할 수 없습니다.
python - 문자열을 인용 된 요소가있는 공백으로 구분 된 목록으로 변환
python - 데비안에서 파이썬 스크립트 데몬 화
python - 사전 인 self 형식 지정
python - 서로 상대적인 Python 필터 목록 항목
python - 비 루트 사용자로서의 감독자 [닫힘]
python - REST API의 일반 (HTML이 아닌) 오류 페이지
python - 지정된 바이트 오프셋에서 파일에서 행 가져 오기
python - 파이썬의 백 슬래시 이스케이프 문자 이해
python - Simplegui 가져 오기 문제