如何在Python实例的初始化过程中调用某些方法

如何在Python实例的初始化过程中调用某些方法,python,oop,Python,Oop,我是Python新手 初始化类Fraction的实例f后,我希望方法reduce已被调用,因此print结果在reduce之后 f = Fraction(3,6) print f #=> 1/2 not 3/6 代码如下: class Fraction(object): '''Define a fraction type''' def __init__(self, num=0, denom=1): '''Create a new Fraction wit

我是Python新手

初始化类
Fraction
的实例
f
后,我希望方法
reduce
已被调用,因此
print
结果在reduce之后

f = Fraction(3,6)

print f #=> 1/2 not 3/6
代码如下:

class Fraction(object):
    '''Define a fraction type'''
    def __init__(self, num=0, denom=1):
        '''Create a new Fraction with numerator num and denominator demon'''
        self.numerator = num
        if denom != 0:
            self.denominator = denom
        else:
            raise ZeroDivisionError
    def reduce(self):
        gcd = findgcd(self.numerator, self.denominator)
        self.numerator /= gcd
        self.denominator /= gcd

    def findgcd(self, x, y):
        gcd = None
        min_number = min(x, y)
        for i in range(min_number, 1, -1):
            if x % i == 0 and y % i == 0:
                gcd = i
        return gcd

    def __repr__(self):
        return "{0}/{1}".format(self.numerator, self.denominator)

是什么阻止您在
\uuu init\uuu
方法末尾调用
self.reduce()

  • 您需要在构造函数中调用
    self.reduce()
    ,以便在实例化阶段调用方法
    reduce()
  • 您还需要更改:

    def reduce(self):
        gcd = findgcd(self.numerator, self.denominator)
    
    致:

  • 因为否则您的实例将无法找到
    findgcd


    以下代码将修复您的问题:

    class Fraction(object):
        '''Define a fraction type'''
        def __init__(self, num=0, denom=1):
            '''Create a new Fraction with numerator num and denominator demon'''
            self.numerator = num
            if denom != 0:
                self.denominator = denom
            else:
                raise ZeroDivisionError
            self.reduce()
    
        def reduce(self):
            gcd = self.findgcd(self.numerator, self.denominator)
            self.numerator /= gcd
            self.denominator /= gcd
    
        def findgcd(self, x, y):
            gcd = None
            min_number = min(x, y)
            for i in range(min_number, 1, -1):
                if x % i == 0 and y % i == 0:
                    gcd = i
            return gcd
    
        def __repr__(self):
            return "{0}/{1}".format(self.numerator, self.denominator)
    
    >>>> f = Fraction(3,6)
    >>>> f
    1/2
    

    我可能会感到困惑,但听起来你只是想在你的uuu init_uuuu方法的末尾调用self.reduce(),
    从分数导入分数
    +1对于简单的答案,它是有效的,我知道我当时在想什么,感谢你的全面回答,并且+1形式指出了另一个错误
    self.gcd
    。顺便说一句,我们的姓是一样的。“你是中国人吗?”yozloy很乐意帮忙!(是的:)准确地说是加拿大华人)太棒了!哇<代码>有线电视上的男人也是我的最爱!我一直在跟踪你twitter@yozloy很高兴找到像这部电影这样的人,所以:)
    class Fraction(object):
        '''Define a fraction type'''
        def __init__(self, num=0, denom=1):
            '''Create a new Fraction with numerator num and denominator demon'''
            self.numerator = num
            if denom != 0:
                self.denominator = denom
            else:
                raise ZeroDivisionError
            self.reduce()
    
        def reduce(self):
            gcd = self.findgcd(self.numerator, self.denominator)
            self.numerator /= gcd
            self.denominator /= gcd
    
        def findgcd(self, x, y):
            gcd = None
            min_number = min(x, y)
            for i in range(min_number, 1, -1):
                if x % i == 0 and y % i == 0:
                    gcd = i
            return gcd
    
        def __repr__(self):
            return "{0}/{1}".format(self.numerator, self.denominator)
    
    >>>> f = Fraction(3,6)
    >>>> f
    1/2