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

2024-04-26 23:56:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Fraction类,并试图在初始化Fraction对象时使用gcd(a,b)。然而,当我尝试这样做时,如果没有Fraction.gcd(a,b)Fraction部分,它将无法工作。我在这里使用了@staticmethod,但是它什么也不做,也就是说,没有它,我的代码也能工作。

我是否可以不把Fraction.放在前面就调用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)

Tags: 对象方法代码selfreturnifinitdef
3条回答

别忘了,在Python中,并不是所有的东西都需要放在一个类中。关于gcd没有什么比独立函数更适合作为类方法:所以把它从类中去掉。现在您只需调用gcd(a, b)

如果类中有一个大方法需要多次调用静态方法,则可以定义一个本地函数对象并将该方法分配给它,以便可以改为调用此函数。

对于静态方法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)

例如方法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

将允许您调用(根据您的请求,开头不带分数:)

gcd(a,b) 

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

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

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

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

不管它是实例方法、类方法还是静态方法。

如果您想保留与类关联的代码,当然可以使用staticmethod,但在Python中通常使用模块级函数,在这种情况下,您可以将其称为gcd

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

class Fraction(object):
    def __init__(self, a, b):
        if( gcd(a,b) > 1):
            d = gcd(a,b)

相关问题 更多 >