【问题标题】:Python3 NameError: name 'method' is not defined for defined @staticmethodPython3 NameError:没有为定义的@staticmethod定义名称“方法”
【发布时间】:2016-03-18 05:02:26
【问题描述】:

我正在尝试在 python3 中编写一个简单的递归函数。在学习 OO Java 时,我也想编写涉及对象的 Python 代码。下面是我的代码。我提示用户输入一个数字,屏幕应显示小于 5 的每个整数。

class Recursion:
    @staticmethod
    def recursive(x):
        if (x>5):
            print (x)
            recursive(x - 1)

def main(self):
    x = int(input('Enter a number for recursive addition: '))
    recursive(x)

但是,当我在终端上运行它时,它显示:“NameError: name 'recursive' is not defined”。以下是错误的样子:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from Recursion import *
>>> a = Recursion()
>>> a.main()
Enter a number for recursive addition: 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ZycinG/Desktop/Python Practice/Recursion.py", line 9, in main
    recursive(x)
NameError: name 'recursive' is not defined

是什么导致了这里的问题?我知道如何编写递归函数,给它一个参数,然后让它在终端上运行。但我想练习OOP。

【问题讨论】:

  • 好吧,您实际上不必在课堂上编写它,但第二个应该可以工作,您能否提供用于实际调用 main 的代码?跨度>
  • 忽略我关于不在课堂上写它的评论,错过了最后一条语句,但如果它实际上不使用来自对象的数据,则将其设为 staticmethod 可能是有意义的。跨度>
  • 使用您提供的第二个代码块和类定义下方的语句Recursion().main(),并在提示程序按预期工作时输入10。好吧,忽略“递归加法”实际上倒数到 6。
  • 当您发布有关错误的问题时,请记住显示导致错误的步骤,而不仅仅是您的代码+“我使用过”。您的错误很可能在于执行而不是准备
  • @TadhgMcDonald-Jensen 感谢您的回复。这是我的带有静态方法的新代码,它仍然说名称未定义? class Recursion: @staticmethod def recursive(x): if (x&gt;5): print (x) recursive(x - 1) def main(self): x = int(input('Enter a number for recursive addition: ')) recursive(x)

标签: python python-3.x oop recursion nameerror


【解决方案1】:

假设您在全局范围内定义了函数:

def recursive(x):
    if (x>5):
        print (x)
        recursive(x - 1)

如果你在一个类中将它设为staticmethod,你只需在程序的其他地方使用recusive(10) 调用它,类似地从函数中调用它:

class Recursion:
    @staticmethod
    def recursive(x):
        if (x>5):
            print (x)
            recursive(x - 1) #this isn't how you call it any more

现在它以Recursion.recursive 的形式存储在全局范围内,因此这也是您必须在函数中引用它的方式:

class Recursion:
    @staticmethod
    def recursive(x):
        if (x>5):
            print (x)
            Recursion.recursive(x - 1)

但是,如果您希望方法能够直接访问类范围(在函数本地),您可以将其标记为 classmethod

class Recursion:
    @classmethod
    def recursive(cls,x): #the first argument is the class
        if (x>5):
            print (x)
            cls.recursive(x - 1)

这有几个好处,首先它可以被称为Recursion.recursive(10)x = Recursion() ; x.recursive(),而且它会在适当的时候使用子类而不是总是使用Recursion

class Recursion:
    def __init__(self,x=None):
        raise NotImplementedError("not intended to initialize the super class")
    @classmethod
    def recursive(x):
        if (x>5):
            print (x)
            cls.recursive(x - 1)
        else:
            return cls(x)

class R_sub(Recursion):
    def __init__(self,x):
        self._val = x
#now using R_sub.recursive(10) will work fine

虽然即使你不使用staticmethodclassmethod你仍然需要引用方法,作为一个方法:(在java中你可以只使用名称但python基本上强制你使用方法作为self.METHOD类似于java的this.METHOD)

class Recursion:
    def recursive(self,x):
        if (x>5):
            print (x)
            self.recursive(x - 1)

希望这能澄清有关方法在 python 中的工作原理!

【讨论】:

  • 成功了!感谢您的回答,这让我更清楚地了解了 python 中的方法是如何工作的!由于 Java 是我的第一语言,因此转换有时会有些混乱。哈哈。
  • 没问题,玩得开心编码,欢迎来到 StackOverflow!
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2021-04-15
  • 2019-01-26
  • 2021-10-05
相关资源
最近更新 更多