Python NameError:名称未定义-找不到方法

时间:2018-06-25 10:51:24

标签: python python-3.x

我正在研究一本书,其中有很多新手知识,下面的代码来自这本书,并定义了一个简单的类。但是出于某种原因,作者决定在类外放置一个名为check_index的“帮助方法”。我一生都无法弄清楚他为什么会这样做,因为这种方法似乎是班上必不可少的。他写道:

  

我编写的实用程序函数负责索引检查   为此,请输入check_index。

我曾尝试将其放入类中(下面的代码与书中的代码相同),但是运行时拒绝找到该方法-它落入了

NameError: name 'check_index' is not defined

我的问题是,为什么作者将这个“帮助方法”放在类之外,为什么当我在类中移动该方法时代码不起作用:

class ArithmeticSequence:
    def __init__(self, start=0, step=1):
        self.start = start # Store the start value
        self.step = step # Store the step value
        self.changed = {} # No items have been modified      
    def __getitem__(self, key):
        check_index(key)
        try: return self.changed[key] # Modified?
        except KeyError: # otherwise ...
            return self.start + key * self.step # ... calculate the value
    def __setitem__(self, key, value):
        check_index(key)
        self.changed[key] = value # Store the changed value


def check_index(key):
    if not isinstance(key, int): raise TypeError
    if key < 0: raise IndexError

当我在类中移动方法时,我只是将其与其他方法放在一起。但是运行时找不到它。为什么?

class ArithmeticSequence:
    def __init__(self, start=0, step=1):
        self.start = start # Store the start value
        self.step = step # Store the step value
        self.changed = {} # No items have been modified
    def check_index(key):
        if not isinstance(key, int): raise TypeError
        if key < 0: raise IndexError        
    def __getitem__(self, key):
        check_index(key)
        try: return self.changed[key] # Modified?
        except KeyError: # otherwise ...
            return self.start + key * self.step # ... calculate the value
    def __setitem__(self, key, value):
        check_index(key)
        self.changed[key] = value # Store the changed value

3 个答案:

答案 0 :(得分:1)

您需要使用self

例如:

class ArithmeticSequence:
    def __init__(self, start=0, step=1):
        self.start = start # Store the start value
        self.step = step # Store the step value
        self.changed = {} # No items have been modified
    def check_index(self, key):
        if not isinstance(key, int): raise TypeError
        if key < 0: raise IndexError        
    def __getitem__(self, key):
        self.check_index(key)
        try: return self.changed[key] # Modified?
        except KeyError: # otherwise ...
            return self.start + key * self.step # ... calculate the value
    def __setitem__(self, key, value):
        self.check_index(key)
        self.changed[key] = value # Store the changed value
  • 并使用自我Ex调用函数:self.check_index

答案 1 :(得分:0)

您的def check_index(key)仍然定义了ArithmeticSequence的方法,无论您调用第一个参数是什么,这意味着您必须像常规实例方法(self.check_index())一样调用它,并且如果要向其传递参数,则必须在self之后添加它。如果要在类本身上定义方法,则可以使用@staticmethod@classmethod

class Foo:
    @staticmethod
    def bar(key):
        return key

    @classmethod
    def baz(cls, key):
        return key

    def quux(self):
        print(Foo.bar("abcd"), Foo.baz("abcd"))

Foo().quux()

答案 2 :(得分:0)

  1. ArithmeticSequence不是新式的类。选中this
  2. 您有2个选项:
    1. self添加到check_index。在课程中,您将其用作self.check_index(key)。您将需要实例化一个ArithmeticSequence类对象。
    2. @staticmethod之前添加check_index。您将其用作ArithmeticSequence.check_index(key)