课程家庭作业帮助
Python被称为“面向对象编程语言”。这意味着Python中有一个称为类的构造,可以让您以特定的方式构建软件。使用类,您可以为程序添加一致性,以便以更清洁的方式使用。
与其他编程语言相比,Python的类机制添加了至少具有新语法和语义的类。它是C ++和Modula-3中发现的类机制的混合体。 Python类提供面向对象编程的所有标准功能:类继承机制允许多个基类,派生类可以覆盖其基类或类的任何方法,并且方法可以调用具有相同名称的基类的方法。对象可以包含任意数量和种类的数据。对于模块来说,类的分类是Python的动态特性:它们是在运行时创建的,并且可以在创建后进一步修改。
在C ++术语中,通常的类成员(包括数据成员)是公共的(除私人变量之外),所有成员函数都是虚拟的。和Modula-3一样,从它的方法中引用对象的成员也没有什么不同:方法函数被声明为一个显式的第一个参数,表示该对象,这是由该调用隐式提供的。像Smalltalk一样,课堂本身就是对象。这提供了导入和重命名的语义。与C ++和Modula-3不同,内置类型可以用作用户扩展的基类。此外,像C ++一样,大多数具有特殊语法(运算符,下标等)的内置运算符可以重新定义为类实例。
(缺少普遍接受的术语来讨论类,我将偶尔使用Smalltalk和C ++术语,我将使用Modula-3术语,因为它的面向对象的语义比C ++更接近Python,但我预计很少读者听说过了。)
9.1。关于名称和对象的一个词
对象具有个性,多个名称(多个范围)可以绑定到同一个对象。这被称为其他语言的别名。这通常不是乍一看的Python,在处理不可变的基本类型(数字,字符串,元组)时可以安全地忽略。然而,混叠对于涉及可变对象(如列表,字典和大多数其他类型)的Python代码的语义可能会产生意想不到的影响。这通常用于程序的利益,因为别名在某些方面表现得像指针。例如,传递对象是便宜的,因为只有一个指针被实现传递;并且如果函数修改作为参数传递的对象,则调用者将看到更改 – 这样就不需要像Pascal那样使用两个不同的参数传递机制。
9.2。 Python范围和命名空间
在介绍课程之前,我首先要告诉你一些Python的范围规则。类定义在名称空间中扮演一些整洁的技巧,您需要知道范围和命名空间如何工作,以充分了解发生了什么。顺便说一下,关于这个问题的知识对于任何高级Python程序员都是有用的。
我们从一些定义开始。
名称空间是从名称到对象的映射。大多数命名空间目前是作为Python字典实现的,但是通常不会以任何方式明显(除了性能),并且它将来可能会改变。命名空间的示例是:内置名称集(包含诸如abs()和内置异常名称的函数);模块中的全局名称;和函数调用中的本地名称。在某种意义上,对象的属性集也形成命名空间。关于命名空间的重要事情是,不同名称空间中的名称之间绝对没有关系;例如,两个不同的模块可以定义功能最大化而不会混淆 – 模块的用户必须使用模块名称前缀。
顺便说一下,我使用单词属性为点之后的任何名称 – 例如,在表达式z.real中,real是对象z的属性。严格来说,对模块中的名称的引用是属性引用:在modname.funcname的表达式中,modname是一个模块对象,funcname是它的一个属性。在这种情况下,模块的属性和模块中定义的全局名称之间恰好有一个简单的映射:它们共享同一个命名空间! [1]
属性可以是只读或可写的。在后一种情况下,属性赋值是可能的。模块属性是可写的:您可以编写modname.the_answer = 42.可写属性也可以用del语句删除。例如,del modname.the_answer将从由modname命名的对象中删除属性the_answer。
命名空间是在不同的时刻创建的,具有不同的使用寿命。当Python解释器启动时,创建包含内置名称的命名空间,并且不会被删除。当模块定义被读入时,会创建一个模块的全局命名空间;通常,模块命名空间也会持续到解释器退出。由脚本文件或交互式读取的解释器的顶级调用执行的语句被认为是名为__main__的模块的一部分,因此它们具有自己的全局命名空间。 (内置的名字实际上也住在一个模块中;这个名字叫做builtins。)
当函数被调用时,会创建函数的本地命名空间,并在函数返回或引发在函数中未处理的异常时被删除。 (实际上,忘记是一个更好的方式来描述实际发生的事情。)当然,递归调用每个都有自己的本地命名空间。
范围是可以直接访问命名空间的Python程序的文本区域。 “直接访问”这里表示对名称的不合格引用尝试在命名空间中查找名称。
尽管范围是静态确定的,但它们是动态使用的。在执行过程中,至少有三个嵌套作用域可以直接访问命名空间:
首先搜索的最内层的范围包含本地名称
从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地的,也包括非全局名称
下一个到最后的范围包含当前模块的全局名称
最外层的范围(最后搜索)是包含内置名称的命名空间
如果一个名称被声明为全局,那么所有引用和分配都直接转到包含模块全局名称的中间范围。要重新绑定在最内层的范围之外的变量,可以使用非本地语句;如果没有声明为非本地,这些变量是只读的(尝试写入这样的变量将简单地在最内层的范围内创建一个新的局部变量,保留相同命名的外部变量)。
通常,本地作用域引用(textually)当前函数的本地名称。外部函数,本地作用域引用与全局范围相同的命名空间:模块的命名空间。类定义在本地范围内放置另一个命名空间。
重要的是要认识到范围是以文本方式确定的:模块中定义的函数的全局范围是该模块的命名空间,无论从何处或通过什么别名调用该函数。另一方面,在运行时实际搜索名称是动态完成的 – 但是,在“编译”时,语言定义正在逐渐演变为静态名称解析,因此不要依靠动态名称解析! (事实上,局部变量已经被静态地确定了。)
Python的一个特别之处在于 – 如果没有全局语句生效 – 名称的赋值总是进入最内层的范围。分配不会复制数据 – 它们只是将名称绑定到对象。删除同样如此:语句del x将从本地作用域引用的命名空间中删除x的绑定。事实上,引入新名称的所有操作都使用本地范围:特别是导入语句和函数定义在本地作用域中绑定模块或函数名称。
全球声明可用于表明特定变量生活在全球范围内,应在那里反弹;非本地语句表示特定变量生活在一个封闭的范围内,应该在那里反弹。
我们在家庭作业中为Python或Python Classes家庭作业提供专家帮助。我们的导师是为各级学生提供家庭作业帮助的专家。