我正在研究一本书,其中有很多新手知识,下面的代码来自这本书,并定义了一个简单的类。但是出于某种原因,作者决定在类外放置一个名为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
答案 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
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)
ArithmeticSequence
不是新式的类。选中this self
添加到check_index
。在课程中,您将其用作self.check_index(key)
。您将需要实例化一个ArithmeticSequence
类对象。@staticmethod
之前添加check_index
。您将其用作ArithmeticSequence.check_index(key)