下面我创建了一个类。我试图在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)
答案 0 :(得分:8)
不要忘记,在Python中并不是所有东西都需要在一个类中。 gcd
没有什么能使它更适合作为一个类方法而不是一个独立的函数:所以把它从类中取出来。现在,您只需致电gcd(a, b)
。
答案 1 :(得分:4)
考虑类中的方法,就像任何其他类属性一样 - 在self
上引用它们:
def __init__(self, a, b):
if( self.gcd(a,b) > 1):
d = self.gcd(a,b)
无论是实例方法,类方法还是静态方法都无关紧要。
如果你想保持代码与类相关联,你肯定可以使用static方法,在Python中通常使用模块级函数,在这种情况下你可以将它称为{ {1}}:
gcd
答案 2 :(得分:3)
如果你的类中有一个很大的方法需要多次调用静态方法,你可以定义一个本地函数对象并将方法分配给它,这样你就可以调用这个函数。
静态方法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)
对于Instance Method 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中的Factorial和Fibonacci”:
答案 3 :(得分:1)
我认为你指的是Java的“import static”功能。
只是为了澄清:当Java强制实现面向对象时,它不能像其他语言那样拥有“模块”。因此,例如,使用import static Math.*;
将使Math
上的所有静态方法都可以在没有类名的情况下被调用。
在Python中,您只需在类外添加此函数并调用它即可。
答案 4 :(得分:0)
这就是静态方法的工作原理。您可以通过Classname.methodname()
(或通过instance.methodname()调用它们,但方法中将无法使用self
。)
您想要的是模块级别的常规功能。在课外定义它,不要装饰它。