2012-01-04 2 views
3

파이썬 설명자에 저장된 상태로 가져올 수 있습니까? 예를 들어파이썬 설명자 개체에 저장된 상태를 어떻게 설명자 외부에서 액세스 할 수 있습니까?

:

class Price(object): 
    def __init__(self, dollars): 
     self.dollars = dollars 

    class Convert(object): 
     def __init__(self, rate): 
      self.rate = rate 
     def __get__(self, instance, owner): 
      return instance.dollars * self.rate 
    euros = Convert(0.75) 

p = Price(20.0) 

print p.dollars 
print p.euros 

작품이 예상대로; 그러나 p.euros을 관리하는 Convert 설명자 내에 저장되어있는 rate을보고 싶습니다. 분명히 p.euros.rate는 작동하지 않지만 변환기의 유로 인스턴스를 얻는 방법을 잘 모르겠습니다.

당신이 클래스를 통해 기술자에 액세스하는 경우

답변

2

(I이 단순화 된 경우 유로에게 재산을 가격에 속도를 가하고 그것이 의미 단순한 예를하게 실현), __get__instance 인수가 될 것입니다 없음. 이 같은 속도를 얻을 그리고

class Price(object): 
    def __init__(self, dollars): 
     self.dollars = dollars 

    class Convert(object): 
     def __init__(self, rate): 
      self.rate = rate 

     def __get__(self, instance, owner): 
      if instance is None: 
       # Accessed through class, return the descriptor instead. 
       return self 
      return instance.dollars * self.rate 

    euros = Convert(0.75) 

: 당신은 설명 자체가를 확인하고 반환 할 수 있습니다

자신의 대답에 야크의 코멘트 위를 할 수있는 올바른 방법을 제공 사실 @
>>> Price.euros.rate 
0.75 
+0

설명 자의 구현에 대한 가정없이이 문제를 해결하는 방법에 대한 아이디어가 있습니까? – Finn

+2

@Finn'Price .__ dict __ [ 'euros']. rate'하지만 이것은 해킹입니다. 가능한 경우 설명자를 수정해야합니다. – yak

3

: __dict__ 클래스를 사용합니다.

은 따라서 수행하여 (Price의 인스턴스로 p을 나열 코드에)을 수행하여 설명을 얻을 수 있습니다 : 기술자 자체가 "클래스 변수"입니다 p.__class__.__dict__["euros"]

참고 그러나 것을 - 그래서, 당신의 예제에서 "euro"속성에 다른 "rate"속성을 가지기 위해 다른 "Price"객체가 필요하다면 Convert 서술자는 self.rate가 아닌 "rate"를 유지해야합니다. "__get__"및 "__set__"메소드에 전달 된 "instance"매개 변수의 "name 맹 글링 된"속성).

이 경우 인스턴스 자체에서 해당 속성에 직접 액세스 할 수 있습니다. 또는 설명 자의 조작하려는 descirptor 속성을 처리하기 위해 "get"및 "setters"(또는 중첩 된 속성)을 구현할 수 있습니다 클래스 그 자체.

+0

'__dict__'에 접근하는 것은 작업을 수행 할 것입니다.하지만 그것은 기분이 나쁘며 디스크립터의 사용 방법이 아닙니다. 그냥 sayin ' – yak

+1

'__dict__'을 평가하는 것은 기술자 객체를 얻는 유일한 방법이며, 구현 세부 사항은 아닙니다. 객체 및 클래스 속성의 검색이 이와 같이 작동한다는 것은 언어 사양에 있습니다. 그러므로, 그것에 대해 "unpythonic"은 없습니다. – jsbueno