如何在类中使用static / helper方法?

时间:2011-10-05 20:58:51

标签: python

下面我创建了一个类。我试图在Fraction对象的初始化中使用方法gcd(a,b)。但是,当我试图这样做时,如果没有“Fraction.gcd(a,b)”的“分数”部分,它将无法工作。我在这里使用了@staticmethod,但它绝对没有任何东西,即我的代码在没有它的情况下工作相同。

无论如何,我可以在不放“分数”的情况下调用gcd。在它面前。在Java中,我通常会创建一个静态方法,然后调用它。我可以很容易地将GCD代码放在init中,但我想在这里学习!

我在这里错过了很多。任何人都可以解释:静态方法,类中的辅助方法,以及我如何在类中使用各种方法?

class Fraction(object):
    def __init__(self, a, b):
        if( Fraction.gcd(a,b) > 1):
            d = Fraction.gcd(a,b)
            self.num = a/d
            self.denom = b/d
        else:
            self.num = a
            self.denom = b

    @staticmethod    
    def gcd(a,b): 
        if a > b: a,b = b,a
        while True:
            if b % a == 0: return a
            a, b = b%a, a

    def __repr__(self):
        return str(self.num) + "/" + str(self.denom)

5 个答案:

答案 0 :(得分:8)

不要忘记,在Python中并不是所有东西都需要在一个类中。 gcd没有什么能使它更适合作为一个类方法而不是一个独立的函数:所以把它从类中取出来。现在,您只需致电gcd(a, b)

答案 1 :(得分:4)

考虑类中的方法,就像任何其他类属性一样 - 在self上引用它们:

def __init__(self, a, b):
    if( self.gcd(a,b) > 1):
        d = self.gcd(a,b)

无论是实例方法,类方法还是静态方法都无关紧要。

如果你想保持代码与类相关联,你肯定可以使用static方法,在Python中通常使用模块级函数,在这种情况下你可以将它称为{ {1}}:

gcd

答案 2 :(得分:3)

如果你的类中有一个很大的方法需要多次调用静态方法,你可以定义一个本地函数对象并将方法分配给它,这样你就可以调用这个函数。

静态方法gdc:

class Fraction(object):    
    def __init__(self, a, b):
        gcd = Fraction.gcd
        if( gcd(a,b) > 1):
            d = gcd(a,b)
            self.num = a/d
            self.denom = b/d
        else:
            self.num = a
            self.denom = b

    @staticmethod    
    def gcd(a,b): 
        if a > b: a,b = b,a
        while True:
            if b % a == 0: return a
            a, b = b%a, a

    def __repr__(self):
        return str(self.num) + "/" + str(self.denom)

对于Instance Method gdc:

class Fraction(object):    
    def __init__(self, a, b):
        gcd = self.gcd
        if( gcd(a,b) > 1):
            d = gcd(a,b)
            self.num = a/d
            self.denom = b/d
        else:
            self.num = a
            self.denom = b

    def gcd(self,a,b): 
        if a > b: a,b = b,a
        while True:
            if b % a == 0: return a
            a, b = b%a, a

    def __repr__(self):
        return str(self.num) + "/" + str(self.denom)

所以

gcd = Fraction.gcd

gcd = self.gcd

允许你打电话(根据你的要求在开头没有Fraction :))

gcd(a,b) 

另外,如果你想要一些python类和实例/静态方法的基本例子 看看我的一些博客文章,特别是“Jython中的Factorial和Fibonacci”:

http://carlosqt.blogspot.com/search/label/Jython

答案 3 :(得分:1)

我认为你指的是Java的“import static”功能。 只是为了澄清:当Java强制实现面向对象时,它不能像其他语言那样拥有“模块”。因此,例如,使用import static Math.*;将使Math上的所有静态方法都可以在没有类名的情况下被调用。 在Python中,您只需在类外添加此函数并调用它即可。

答案 4 :(得分:0)

这就是静态方法的工作原理。您可以通过Classname.methodname()(或通过instance.methodname()调用它们,但方法中将无法使用self。)

您想要的是模块级别的常规功能。在课外定义它,不要装饰它。