如何在类中使用静态/辅助方法?
我正在写一个 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 个回答
如果你的类里面有一个很大的方法,需要多次调用一个静态方法,你可以定义一个局部的函数对象,把这个方法赋值给它,这样你就可以直接调用这个函数了。
对于静态方法 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中的阶乘和斐波那契”的:
把类里的方法想象成类的其他属性一样——在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)
别忘了,在Python中并不是所有东西都需要放在类里面。gcd
这个函数并没有什么特别之处,让它更适合放在类里,而不是作为一个独立的函数。所以,把它从类里拿出来吧。现在你可以直接用 gcd(a, b)
来调用它。