Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在类中使用静态/辅助方法?_Python - Fatal编程技术网

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

Python 如何在类中使用静态/辅助方法?,python,Python,我正在编写一个分数类,并试图在分数对象的初始化中使用gcd(a,b)。然而,当我尝试这样做时,如果没有Fraction.gcd(a,b)的部分,它将无法工作。我在这里使用了@staticmethod,但它完全不起作用,也就是说,没有它,我的代码也能正常工作 我是否可以调用gcd,而不在它前面加上分数。?在Java中,我通常会创建一个静态方法,然后调用它。我可以很容易地将GCD代码放在init中,但我在这里尝试学习 我在这里错过了很多。有人能解释一下:静态方法、类中的helper方法以及我如何在类

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

我是否可以调用
gcd
,而不在它前面加上
分数。
?在Java中,我通常会创建一个静态方法,然后调用它。我可以很容易地将GCD代码放在init中,但我在这里尝试学习

我在这里错过了很多。有人能解释一下:静态方法、类中的helper方法以及我如何在类中使用各种方法吗

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)

静态方法就是这样工作的。您可以通过
Classname.methodname()
调用它们(或者通过instance.methodname(),但是
self
在方法内部不可用)


您需要的是模块级的常规函数。在类之外定义它,不要修饰它。

像任何其他类属性一样考虑类中的方法——在
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)

如果类中有一个大方法需要多次调用静态方法,则可以定义一个局部函数对象并将该方法分配给它,这样就可以调用该函数

对于静态方法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)
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)
例如,方法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)
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)
所以

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

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


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

我想您指的是Java的“导入静态”特性。 只是想澄清一下:由于Java强制执行面向对象,它不能像其他语言一样拥有“模块”。因此,使用
导入静态数学。*将使
Math
上的所有静态方法都可以在没有类名的情况下调用。
在Python中,您可以在类之外添加此函数并调用它。

是的,这不是Java,函数可以存在于类之外。最好说“类上的方法”或“静态方法”,因为“类方法”有特定的含义,而不是类方法。“方法”已经暗示它在类中。非方法函数只是“函数”。在Python中,
staticmethod
在很大程度上是无用的?换句话说,如果我把gcd放在Fraction类之外,但是创建了一个Fraction,那么即使它不在被实例化的类之内,它还会计算gcd吗?为了概括这一点,类仍然可以访问的类之外的函数在实例化时是否仍然可以被类使用?是的,为什么不?只要代码在同一个模块中,或者导入它。重要的是代码在哪里,而不是在哪里运行。@Boris“改进”代码的空格充其量是有风险的(缩进可能是个例外)。更改代码(即删除成对的
()
)超出了编辑的范围。
gcd(a,b)