【问题标题】:How do I call a method from another method?如何从另一个方法调用一个方法?
【发布时间】:2015-06-16 05:48:54
【问题描述】:

我正在用 python 编写程序。我介绍了一个整数,程序返回给我这个数字的素因数分解。 例如 6 ---> 3, 2。另一个例子 16 --> 2, 2, 2, 2。

我正在使用 OOP 来做这件事。我创建了一个具有 2 种方法(is_primeprime_factor_decomposition)的类(PrimeFactors)。第一种方法判断数字是否为素数,第二种方法返回分解。

这是代码:

class PrimeFactors(object):
    def __init__(self, number):
        self.number = number

    def is_prime(self):
        n = self.number - 1
        a = 0
        loop = True

        if self.number == 1 or self.number == 2:
            loop = False

        while n >= 2 and loop:
            if self.number % n != 0:
                n -= 1
            else:
                a += 1
                loop = False
        return a == 0

    def prime_factor_decomposition(self): 
        factors = [] 
        n = self.number - 1
        loop = True

        if PrimeFactors.is_prime(self.number):
            factors.append(self.number)
            loop = False

        while n >= 2 and loop:
            if self.number % n == 0 and PrimeFactors.is_prime(n):
                factors.append(n)
                self.number = self.number / n
                if self.number % n == 0:
                    n += 1
            n -= 1
        return factors

s = PrimeFactors(37)
print(s.is_prime())

我弄错了。我认为这与方法调用有关。 我的问题是,如果它们都来自同一个类,我如何从另一个方法调用一个方法?

【问题讨论】:

    标签: python oop python-3.x methods


    【解决方案1】:

    你需要使用self.来调用同一个类的另一个方法:

    class Foo:
        def __init__(self):
            pass
    
        def method1(self):
            print('Method 1')
    
        def method2(self):
            print('Method 2')
            self.method1()
    

    【讨论】:

      【解决方案2】:

      Jkdc 的回答绝对正确。我还想指出你的方法调用会有问题。您定义了is_prime 以将self 作为其唯一参数,但是当您调用它时,您传入的是self.numbern

      如果您需要 is_prime 处理任意数字,而不仅仅是初始化类的任何值,您应该添加一个额外的参数。

      【讨论】:

        【解决方案3】:

        只是一个一般建议:有很好的(而且很快!)算法来检查一个数字是否是素数。你的循环从 n-1 开始,那是非常低效的。可以说这个数字是 1000000,所以你的算法从 999999 开始,但第一个可能的偶数是 n 的一半!所以我会从 2 到 n/2:

        for i in range(n/2):
            if self.number%i==0:
                return true
        return false
        

        我认为更适合您的目的不是返回布尔值,而是返回数字,发现它是除数:

        for i in range(n/2):
            if self.number%i==0:
                return i
        return 0
        

        那么你可以重复调用该方法并且只会得到质数。

        【讨论】:

          猜你喜欢
          • 2010-12-24
          • 1970-01-01
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 2017-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多