我在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())
object
论点是什么(obj)
并生成错误,为什么?__init__
设置构造函数?self
是一个参数,但它是如何通过的?它自己代表哪个对象?感谢。
答案 0 :(得分:3)
object
是一个类,Stack
类继承自该类。没有
类obj
,因此错误。但是,您可以定义一个类
不是从任何东西继承(至少在Python 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
是类的当前实例(调用该方法的实例),因此如果s
是Stack
类的实例,{{ 1}}相当于s.push(42)
。
请注意,参数不必被称为Stack.push(s, 42)
(这只是一个惯例,虽然是非常强大的),重要的是它是第一个参数。< / p>
self
s
如何在调用self
时传递的内容有点复杂,但有一个有趣的例子说明如何使用小的功能集来构建更大的功能集。你可以找到一个detailed explanation of the whole mechanism here,所以我不打算在这里重新发布。