2011-10-05 74 views
2

下面我创建了一个类。我试图在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) 
+6

“在Java中我会......” - 你的第一个错误。 Python不是Java。它不甚密切。 – delnan

+1

是的,这不是Java,函数可以存在于一个类之外。 –

回答

6

不要忘了,在Python不是一切需要在一个类。没有什么关于gcd,使它更适合作为类方法而不是独立函数:所以将它从类中取出。现在您可以致电gcd(a, b)

+0

由于“类方法”具有特定含义并且不是类方法,所以最好说“类中的方法”或“静态方法”。 – agf

+0

“方法”已经暗示它在课堂上。非方法功能只是“功能”。和+1,'staticmethod'在Python中基本没用。 –

+0

如果我从该类创建了一个对象,但该函数在该类之外,它仍然可以工作吗?换句话说,如果我将gcd放在Fraction类之外,但创建了一个分数,它是否仍然计算gcd,即使它不在被实例化的类内部?为了概括这一点,这些在类之外的仍然能够被类实例化时仍然可以被该类访问的函数? – mergesort

0

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

你想要的是模块级的常规功能。在课堂外定义它,不要装饰它。

+0

我已经更新了我的回答以澄清它。 – ThiefMaster

4

的,就像任何其他类属性的类方法思考 - 引用它们的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) 
2

如果您有需要多次调用静态方法,你可以定义一个本地函数对象和方法分配给它,就可以调用这个函数,而不是你的类中的一大方法。

对于静态方法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中”:

http://carlosqt.blogspot.com/search/label/Jython

1

我想你是指Java的“导入静态”功能。 只是为了澄清:由于Java强制面向对象,因此它不能像其他语言那样具有“模块”。因此,例如使用import static Math.*;将使所有在Math上的静态方法可用于不带类名称的调用。 在Python中,您可以在类之外添加此函数并调用它。

相关问题