【问题标题】:Function into a Python class函数转换为 Python 类
【发布时间】:2013-06-01 13:48:29
【问题描述】:

我是 Python 新手,我写了以下代码:

class Frazione:
    def __init__(self, Numeratore, Denominatore=1):
        mcd=MCD(Numeratore,Denominatore)
        self.Numeratore=Numeratore/mcd
        self.Denominatore=Denominatore/mcd

    def MCD(m,n):
        if m%n==0:
            return n
        else:
            return MCD(n,m%n)

    def __str__(self):
        return "%d/%d" %(self.Numeratore, self.Denominatore)

    def __mul__(self, AltraFrazione):
        if type(AltraFrazione)==type(5):
            AltraFrazione=Frazione(AltraFrazione)
        return Frazione(self.Numeratore*AltraFrazione.Numeratore, self.Denominatore*AltraFrazione.Denominatore)

    __rmul__=__mul__

在 Frazione.py 的同一文件夹中打开 shell:

>>> from Frazione import Frazione 

然后结束

>>> f=Frazione(10,5)

当我按下 Enter 键时,我会收到以下输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".\Frazione.py", line 5, in __init__
  mcd=MCD(Numeratore,Denominatore)
  NameError: global name 'MCD' is not defined

PS。我为我的英语道歉!

【问题讨论】:

  • 请注意,建议您使用英文标识符编写代码。这使获得帮助变得更容易,并允许更多人更轻松地阅读您的代码。 (参考:python.org/dev/peps/pep-0008/.
  • 你在找python自带的fractions.Fraction吗?
  • 对于标识符我很抱歉!我只是复制并粘贴我的代码。关于这个问题,这是一个练习,所以我不在乎fractions.Fraction

标签: python class function python-3.x


【解决方案1】:

MCDFrazione 的一个方法,但您将它当作一个全局函数来调用。最简单(也是最干净,恕我直言)的解决方法是将其移到类之外,因为它不需要访问任何类或实例成员。

所以:

def MCD(m, n):
    if m % n == 0:
        return n
    else:
        return MCD(n, m % n)

class Frazione:
    # as before but without MCD

如果您确实想将其保留在类中,那么您可以将其重写为迭代而不是递归,并将其称为 self.MCD in __init__。无论如何,这是个好主意,因为 Python 对递归的支持相当弱。

【讨论】:

  • 您能否详细说明“Python 对递归的支持比较弱”?您是指 Python 中的函数调用相对较慢这一事实吗?
  • @EOL:没有尾调用消除,the BFDL doesn't want it either。然后是速度问题,单一的全局深度限制(当然可以重置)以及使用深度递归时异常回溯会变得非常大的事实,这使得调试变得困难。 “平面优于嵌套”的格言适用于算法和数据结构。
  • 如果我将 MCD 移到课堂之外,它会起作用。谢谢!但我不知道为什么,当我之前尝试发布这个问题时,它没有用。 (:
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2017-04-18
  • 2022-01-04
相关资源
最近更新 更多