如何在类中使用静态/辅助方法?
下面我创建了一个类。我试图在Fraction对象的初始化中使用方法gcd(a,b)。但是,当我尝试这样做时,它将无法在“Fraction.gcd(a,b)”的“分数”部分中工作。我在这里使用了@staticmethod,但它绝对没有任何问题,即我的代码在没有它的情况下也是一样的。如何在类中使用静态/辅助方法?
反正我有可以打电话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)
不要忘了,在Python不是一切需要在一个类。没有什么关于gcd
,使它更适合作为类方法而不是独立函数:所以将它从类中取出。现在您可以致电gcd(a, b)
。
这就是静态方法的工作原理。你可以通过Classname.methodname()
(或者通过instance.methodname()来调用它们,但self
在方法内部不可用)。
你想要的是模块级的常规功能。在课堂外定义它,不要装饰它。
我已经更新了我的回答以澄清它。 – ThiefMaster
的,就像任何其他类属性的类方法思考 - 引用它们的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)
如果您有需要多次调用静态方法,你可以定义一个本地函数对象和方法分配给它,就可以调用这个函数,而不是你的类中的一大方法。
对于静态方法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中”:
我想你是指Java的“导入静态”功能。 只是为了澄清:由于Java强制面向对象,因此它不能像其他语言那样具有“模块”。因此,例如使用import static Math.*;
将使所有在Math
上的静态方法可用于不带类名称的调用。 在Python中,您可以在类之外添加此函数并调用它。
“在Java中我会......” - 你的第一个错误。 Python不是Java。它不甚密切。 – delnan
是的,这不是Java,函数可以存在于一个类之外。 –