AttributeError:'list'对象没有属性'_Stack__items'

时间:2015-01-30 03:04:37

标签: python python-3.x

我有一个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循环吗?

2 个答案:

答案 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关键字,如果它不依赖任何类变量来像对待任何其他函数一样对待它。