我有一个Stack类,我在其中实现了一个反转字符串的函数。
class Stack:
def __init__(self,x):
self.__items = []
def reverse(self):
if len(self.__items ) <= 1:
return self.__items
else:
return reverse(self.__items [1:]) + self.__items [0]
word=input("Please enter word to reverse: ")
list_word=list(word)
rev=Stack.reverse(list_word)
print(rev)
我有一个功能齐全的反向功能,但我的班级却给我一个属性错误。思考?我需要一个for循环吗?
答案 0 :(得分:1)
如果要将其称为静态方法,则以下内容应该有效:
@staticmethod
def reverse(the_list):
if len(the_list) <= 1:
return the_list
else:
return reverse(the_list[1:]) + [the_list[0]]
但最终,我认为您误解了静态方法和实例方法之间的差异。
实例方法
只能在对象的实例上调用实例方法。对于Stack
类,您必须像这样调用方法:
stack = Stack()
stack.reverse([1, 2, 3, 4])
首先,我们必须创建Stack
类的实例,然后调用其实例方法reverse
。使用实例方法,reverse
的方法签名将如下所示:
def reverse(self, the_list):
请注意,方法签名中列出了两个参数,即使我们在上面调用它时只传递了一个参数。这是因为,对于实例方法,有一个隐式self
参数,它表示我们正在调用该方法的对象的实例。任何其他参数都将绑定到后续参数。我们的列表[1, 2, 3, 4]
绑定到函数的the_list
参数。
将此与...对比
静态方法
静态方法是附加到类本身的方法,而不是该类的实例。因此,您不需要实例来调用该方法。这就是你在问题中得到的:
#calling the method statically
Stack.reverse([1, 2, 3, 4])
在Stack
类中,reverse
的方法签名如下所示:
@staticmethod
def reverse(the_list):
注意区别:不再有self
参数了。这是因为静态方法就像普通函数一样,但是它附加在一个类上。因为它是一个正常的函数,所以没有与之关联的对象实例,因此没有self
参数。
以下是一个更好的解释:https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods
答案 1 :(得分:0)
stack.reverse不是静态方法。你必须定义一个堆栈对象并在该对象上运行该函数。为了将来参考,你可以在方法的顶部使用python的@staticmethod关键字,如果它不依赖任何类变量来像对待任何其他函数一样对待它。