2013-05-23 3 views
3

I 분수 (예를 들어, (1,2), (3,4) 등)와 함께 작동이 클래스가 있습니다파이썬 하위 클래스

class Fraction(object): 

    def __init__(self, num=0, denom=1): 
     ''' Creates a new Fraction with numberator num and denominator denom''' 
     self.numerator = num 
     if denom != 0: 
      self.denominator = denom 
     else: 
      raise ZeroDivisionError 
    def __str__(self): 
     '''Returns the string numerator/denominator ''' 
     return "{0}/{1}".format(self.numerator, self.denominator) 
    def __repr__(self): 
     """blah""" 
     return Fraction(self.numerator, self.denominator) 

가 내가 하위 클래스 혼합 된 번호가 할 정수와 분수 (예 : 2 분수 (1,2), 3 분수 (3,4) 등)를 모두 받아 들일 수 있습니다. 나는 제공 Fraction 클래스와 MixedNumber 클래스를 구현 생각하면 바로 떠오르는 두 가지 방법이

class MixedNumber(Fraction): 
+4

'MixedNumber'가'Fraction'에서 상속받는 것은 당연하다고 생각하지 않습니다. 'MixedNumber' 클래스에'Fraction'을 * 작성하는 것이 더 합리적 일 것입니다. –

+0

@HunterMcMillen에 동의하지만 레코드 끝에 대해서는 게시물의 마지막에 사용하는 구문이 Python에서 상속하기에 적합합니다. 어쩌면 당신이 묻고있는 것이거나 당신이 직면하고있는 문제를 이해하지 못할 수도 있습니다. 분명히 해줄 수 있니? – jpmc26

+1

서브 클래스는 항상 'is a'관계를 의미합니다. 그래서'MixedNumber'는'Fraction'으로부터 상속 받기에 적합하지 않습니다. – zhangyangyu

답변

5

을 주시면 감사하겠습니다 수행하는 방법에 관해서는, 그러나 어떤 도움을이 작업을 수행하는 방법을 잘 모르겠어요 . 한가지 방법은 @HunterMcMillen이 제안한대로 클래스가 각각 컴포지트을 사용하도록하는 것입니다. 이는 별개의 개체를 사용하여 정수와 소수 부분을 각각 나타내는 것입니다. 이렇게하면 클래스 내의 각 객체의 특수 메서드에 액세스 할 수 있습니다.이 메서드는 구축하려는 구성 요소에 각각 캡슐화 된 고유 한 동작이 있으면 편리 할 수 ​​있습니다.

class MixedNumber(object): 
    def __init__(self, whole_number, fraction): 
     self.whole_number = whole_number 
     self.fraction = fraction 

    def __str__(self): 
     if self.fraction.numerator == 0: 
      return str(self.whole_number) 
     elif self.whole_number == 0: 
      return str(self.fraction) 
     else: 
      return '{} {}'.format(self.whole_number,self.fraction) 

    def __repr__(self): 
     return 'MixedNumber({},{!r})'.format(self.whole_number,self.fraction) 

다른 가능성은 Fraction 클래스가 가분수를 지원하는 경우 다음과 같이, 당신은, 적절하게 혼합 된 숫자 형식으로 렌더링 초기화 및 문자열을 처리하는 서브 클래스를 사용할 수 상속입니다 :

class MixedNumber(Fraction): 
    def __init__(self, whole_number, fraction):  
     num = whole_number * fraction.denominator + fraction.numerator 
     super(MixedNumber,self).__init__(num, fraction.denominator) 

    def __str__(self): 
     # assume positive fractions for demonstration only 
     q, r = divmod(self.numerator,self.denominator) 
     if r == 0: 
      return str(q) 
     elif q == 0: 
      return super(MixedNumber,self).__str__() 
     else: 
      return '{} {}/{}'.format(q,r,self.denominator) 

    def __repr__(self): 
     q, r = divmod(self.numerator, self.denominator) 
     return 'MixedNumber({},Fraction({},{}))'.format(q,r,self.denominator) 

Fraction.__repr__ 메서드는 eval에 전달되면 소스 객체와 동일한 내용 (즉, eval(frac) == frac)을 인스턴스화해야하는 문자열을 반환해야합니다. __str____eval__의 구별에 대한 자세한 내용은 this stack overflow question을 참조하십시오.

+0

대단히 감사합니다! – user2101517

0

최근에 표준 라이브러리 Fraction 클래스를 상속받은 클래스 Mixed 작성을 마쳤습니다. 부모 클래스의 기존 기능을 사용하는 방법에 대한 좋은 지침이 될 것입니다. 출처는 HERE입니다. 라이브러리 Fraction 클래스가 받아 들일 수있는 모든 것뿐만 아니라 Mixed('3 4/5') 또는 whole_number/numerator/denominator과 같은 혼합 숫자의 문자열 표현도 Mixed(3,4,5)과 같이 설정합니다. Fraction의 모든 기능이 보존되었습니다. __str____repr__은 각각 3 4/5Mixed(3,4,5)을 산출 할 것이다. float 또는 표준 Fraction으로 변환하면 쉽게 float(m) 또는 Fraction(m)이됩니다. 건배