与班级

时间:2017-07-19 10:22:23

标签: python stack

我在Python中理解数据结构的一些概念时遇到了问题,在下面的代码中。

class Stack(object):                        #1
    def __init__(self):                     #2
        self.items=[] 

    def isEmpty(self):
         return self.items ==[]

    def push(self,item):
        self.items.append(item)

    def pop(self):
        self.items.pop()

    def peak(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

s = Stack()
s.push(3)
s.push(7)

print(s.peak())
print (s.size())
s.pop()
print (s.size())

print (s.isEmpty())
    1. 我不明白这个object论点是什么
    2. 我将其替换为(obj)并生成错误,为什么?
    3. 我试图删除它并且它工作得很好,为什么?
    1. 为什么我要__init__设置构造函数?
    2. self是一个参数,但它是如何通过的?它自己代表哪个对象?
  1. 感谢。

3 个答案:

答案 0 :(得分:3)

  1. object是一个类,Stack类继承自该类。没有 类obj,因此错误。但是,您可以定义一个类 不是从任何东西继承(至少在Python 2中)。
  2. self表示调用该方法的对象;对于 例如s.pop(),方法self内的pop引用 与s相同的对象 - 它不是一个类,它是该类的实例

答案 1 :(得分:2)

<强> 1

这里的对象是新类继承的类。已经存在一个名为object的基类,但是没有名为obj的类,这就是为什么用obj替换对象会导致错误。无论如何,在你的示例代码中根本不需要它,因为python 3中的所有类都隐式扩展了对象类。

<强> 2

__ init__是对象的构造函数,self表示你自己创建的对象,而不是类,就像你在其他方法中一样。

答案 2 :(得分:2)

第1点:

这里需要一些历史记录......最初Python有两种不同的类型,一种是用C语言实现的(无论是在stdlib还是在C扩展中),另一种是用Python class语句实现的。 Python 2.2 introduced a new object model(称为&#34;新式类&#34;)统一了两者,但保留了经典&#34; (又名&#34;旧式&#34;)兼容性模型。这个新模型还引入了很多好东西,比如支持计算属性,通过super()对象的协同超级调用,元类等,所有这些都来自内置的object基类。

因此,在Python 2.2.x到2.7.x中,您可以通过继承object(或object的任何子类)或旧式的类来创建新式类。继承自object(也不是 - 显然 - object的任何子类。)

在Python 2.7。中,由于您的示例Stack类不使用新对象模型的任何功能,因此它的工作方式与旧版本的#{1}}相同。或作为一种新式的&#39; class,但尝试添加自定义元类或计算属性,它会以某种方式中断。

Python 3完全删除了旧式类支持,object是defaut基类,如果你没有明确指定一个,那么无论你做什么,你的类都会继承object并且同样适用于或没有明确的父类。

您可以read this了解更多详情。

第2.1点 - 我不确定我实际上是否理解这个问题,但无论如何:

在Python中,对象不是固定的类似C-struct的结构,具有一组固定的属性,而是类似于dict的映射(有异常,但暂时忽略它们)。对象的属性集由类属性(主要是方法,但实际上是在类级别定义的任何名称)组成,这些属性在类的所有实例之间共享,而实例属性(属于单个实例)存储在实例__dict__。这意味着您不要定义在类级别设置的实例属性(如在Java或C ++等中),而是在实例本身上设置它们。

__init__方法就在那里,因此您可以确保使用所需的属性集初始化每个实例。它类似于Java构造函数,但它不仅仅用于在instanciation传递参数,而且还负责为您的类定义实例属性集(您可以在Java中使用它们) ,在班级定义)。

第2.2点:self是类的当前实例(调用该方法的实例),因此如果sStack类的实例,{{ 1}}相当于s.push(42)

请注意,参数不必被称为Stack.push(s, 42)(这只是一个惯例,虽然是非常强大的),重要的是它是第一个参数。< / p>

self s如何在调用self时传递的内容有点复杂,但有一个有趣的例子说明如何使用小的功能集来构建更大的功能集。你可以找到一个detailed explanation of the whole mechanism here,所以我不打算在这里重新发布。