2009-12-24 1 views
3

그래서이 클래스는 x = 0 일 때 '{0}'을 출력하거나 x의 다른 모든 값에 대해 '{1}'을 출력합니다.str.format() 문제

class offset(str): 
    def __init__(self,x): 
     self.x=x 
    def__repr__(self): 
     return repr(str({int(bool(self.x))})) 
    def end(self,end_of_loop): 
    #ignore this def it works fine 
     if self.x==end_of_loop: 
      return '{2}' 
     else: 
      return self 

나는이 작업을 수행 할 수 :
offset(1).format('first', 'next')
하지만 그것은 단지 내가 문자열로 X의 줄 수를 반환합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

4

그냥 즉 self의 "str 같은 본질적인 가치"를 사용 str에서 상속을 사용 그래서 당신은 그것의 인스턴스 중 하나에 format를 호출 할 때 format를 대체하지 않습니다 str 귀하의 서브 클래스의 캐릭터 라인 형식이든 당신은 offset()에게 건네 줬습니다. 경우도 __new__를 재정 의하여, __repr__를 오버라이드 (override) 할 필요가 없습니다

{0} 
'{0}' 
first 
{1} 
'{1}' 
next 

주, 당신은 이미 확보하고

class offset(str): 
    def __init__(self, x): 
     self.x = x 
    def __new__(cls, x): 
     return str.__new__(cls, '{' + str(int(bool(x))) + '}') 

for i in (0, 1): 
    x = offset(i) 
    print x 
    print repr(x) 
    print x.format('first', 'next') 

가 방출 :

__new__을 무시할 수있는 그 본질적인 가치, 예를 변경하려면 인스턴스의 고유 값이 str으로 원하는 형식입니다.