Delegation in Python

Gary Herron gherron at digipen.edu
Sun Jan 25 00:41:17 CET 2015


On 01/24/2015 03:22 PM, Chris Angelico wrote:
> On Sun, Jan 25, 2015 at 9:57 AM, Brian Gladman <noone at nowhere.net> wrote:
>> But I am not clear on how to delegate from my new class to the existing
>> Fraction class.  This is what I have:
>>
>> --------------------------
>> class RF(Fraction):
>>
>>    def __new__(self, x, y):
>>      super().__new__(self, x, y)
>>
>>    def is_integer(self):
>>      return self.numerator % self.denominator == 0
>>
>>    def __getattr__(self, attr):
>>      return getattr(self, attr)
> If you just drop everything but your new method, it should work just fine.
>
> class RF(Fraction):
>      def is_integer(self):
>         return self.numerator % self.denominator == 0
>
> However, this doesn't ensure that operations on RFs will return more
> RFs - they'll often return Fractions instead. There's no easy fix for
> that, sorry.
>
> ChrisA

You can always "monkey-path" the Fraction class on the fly to add a new 
method to it.  I think most would consider this a bad idea, but it does 
work.
Try this:

 >>> from fractions import Fraction
 >>> def is_integer(self):
...     return self.numerator % self.denominator == 0
...
 >>> Fraction.is_integer = is_integer # Monkey-patch Fraction
 >>>
 >>> Fraction(1,2).is_integer()
False
 >>> Fraction(2,1).is_integer()
True


Gary Herron


-- 
Dr. Gary Herron
Department of Computer Science
DigiPen Institute of Technology
(425) 895-4418




More information about the Python-list mailing list