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强制执行面向对象,它不能像其他语言一样拥有“模块”。因此,使用导入静态数学。*例如,code>将使Math
上的所有静态方法都可以在没有类名的情况下调用。
在Python中,您可以在类之外添加此函数并调用它。是的,这不是Java,函数可以存在于类之外。最好说“类上的方法”或“静态方法”,因为“类方法”有特定的含义,而不是类方法。“方法”已经暗示它在类中。非方法函数只是“函数”。在Python中,staticmethod
在很大程度上是无用的?换句话说,如果我把gcd放在Fraction类之外,但是创建了一个Fraction,那么即使它不在被实例化的类之内,它还会计算gcd吗?为了概括这一点,类仍然可以访问的类之外的函数在实例化时是否仍然可以被类使用?是的,为什么不?只要代码在同一个模块中,或者导入它。重要的是代码在哪里,而不是在哪里运行。@Boris“改进”代码的空格充其量是有风险的(缩进可能是个例外)。更改代码(即删除成对的()
)超出了编辑的范围。
gcd(a,b)