如何在类中使用静态/辅助方法?

7 投票
5 回答
37880 浏览
提问于 2025-04-17 03:45

我正在写一个 Fraction 类,想在初始化一个 Fraction 对象时使用 gcd(a,b) 函数。但是,当我尝试这样做时,发现如果不加上 Fraction 前缀的 Fraction.gcd(a,b) 是无法工作的。我在这里用了 @staticmethod,但它完全没有作用,也就是说我的代码在有或没有它的情况下效果是一样的。

有没有办法让我在调用 gcd 时不需要在前面加上 Fraction.?在 Java 中,我通常会创建一个静态方法,然后直接调用它。我可以很简单地把求最大公约数的代码放在初始化方法里,但我想在这里学习一些东西!

我在这方面缺少很多知识。有没有人能解释一下:静态方法、类中的辅助方法,以及我如何在类中使用各种方法?

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 个回答

5

如果你的类里面有一个很大的方法,需要多次调用一个静态方法,你可以定义一个局部的函数对象,把这个方法赋值给它,这样你就可以直接调用这个函数了。

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

将允许你调用(根据你的要求,不用在前面加 Fraction :))

gcd(a,b) 

另外,如果你想看看一些关于 Python 类和实例/静态方法的基本例子,可以看看我一些博客文章,特别是那篇叫做“Jython中的阶乘和斐波那契”的:

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

8

把类里的方法想象成类的其他属性一样——在self上引用它们就行:

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

不管是实例方法、类方法还是静态方法,这都没关系。

虽然你当然可以使用静态方法,如果你想把代码和类关联在一起,但在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)
11

别忘了,在Python中并不是所有东西都需要放在类里面。gcd这个函数并没有什么特别之处,让它更适合放在类里,而不是作为一个独立的函数。所以,把它从类里拿出来吧。现在你可以直接用 gcd(a, b) 来调用它。

撰写回答