返回介绍

编写类树

发布于 2024-01-29 22:24:15 字数 2383 浏览 0 评论 0 收藏 0

虽然这里的描述很抽象,这些概念内都有具体的代码。我们以class语句和类调用来构造一些树和对象,这些内容稍后我们会详细介绍。简而言之,内容如下所示。

·每个class语句会生成一个新的类对象。

·每次类调用时,就会生成一个新的实例对象。

·实例自动连接至创建了这些实例的类。

·类连接至其超类的方式是,将超类列在类头部的括号内。其从左至右的顺序会决定树中的次序。

例如,要建立图25-1的树,我们可以运行这种形式的Python代码(在这里省略了class语句中的内容)。

在这里,通过运行三个class语句创建了三个类对象,然后通过两次调用类C1,创建两个实例对象,这就好像它是一个函数一样。这些实例记住了它们来自哪个类,而类C1也记住了它所列出的超类。

从技术角度来讲,这个例子使用的是所谓的多重继承。也就是说,在类树中,类有一个以上的超类。在Python中,如果class语句中的小括号内有一个以上的超类(像这里的C1),它们由左至右的次序会决定超类搜索的顺序。

因为继承搜索以这种方式进行,你要进行属性附加的对象就变得重要起来:这决定了变量名的作用域。附加在实例上的属性只属于那些实例,但附加在类上的属性则由所有子类及其实例共享。稍后,我们将会深入研究把属性增加在这些对象上的代码。我们将会发现:

·属性通常是在class语句中通过赋值语句添加在类中,而不是嵌入在函数的def语句内。

·属性通常是在类内,对传给函数的特殊参数(也就是self),做赋值运算而添加在实例中的。

例如,类通过函数(在class语句内由def语句编写而成)为实例提供行为。因为这类嵌套的def会在类中对变量名进行赋值,实际效果就是把属性添加在了类对象之中,从而可以由所有实例和子类继承。

在这样的环境下,def的语法没有什么特别之处。从操作的角度来看,当def出现在这种类的内部时,通常称为方法,而且会自动接收第一个特殊参数(通常称为self),这个参数提供了被处理的实例的参照值[1]

因为类是多个实例的工厂,每当需要取出或设定正由某个方法调用所处理的特定的实例的属性时,那些方法通常都会通过这个自动传入的参数self。在之前的代码中,self是用来储存两个实例之一的内部变量名的。

就像简单变量一样,类和实例属性并没有事先声明,而是在首次赋值时它的值才会存在。当方法对self属性进行赋值时,会创建或修改类树底端实例(也就是其中一个矩形)内的属性,因为self自动引用正在处理的实例。

事实上,因为类树中所有对象都不过是命名空间对象,我们可以通过恰当的变量名读取或设置其任何属性。只要变量名C1和I1都位于代码的作用域内,写C1.setname和写I1.setname同样都是有效的。

就目前编写的代码而言,直到setname方法调用前,C1类都不会把name属性附加在实例之上。事实上,调用I1.setname前引用I1.name会产生未定义变量名的错误。如果类想确保像name这样的变量名一定会在其实例中设置,通常都会在构造时填好这个属性。

写好并继承后,每次从类产生实例时,Python会自动调用名为__init__的方法。新实例会如往常那样传入__init__的self参数,而列在类调用小括号内的任何值会成为第二以及其后的参数。其效果就是在创建实例时初始化了这个实例,而不需要额外的方法调用。

由于__init__方法的运行时机,它也称作是构造函数。这是所谓的运算符重载方法这种较大类型方法中最常用的代表,我们会在接下来几章详细介绍这种方法。这种方法会像往常一样在类树中被继承,而且在变量名开头和结尾都有两个下划线以使其变得特别。当能够支持通信操作的实例出现在对应的运算时,Python就会自动运行它们,而且它们是使用简单方法调用最常用的替代方法。这类方法也是可选的:省略时,不支持这类运算。

例如,要实现集合交集,类可能会提供名为intersect的方法,或者重载表达式运算符&,也就是编写名为__and__的方法来处理所需要的逻辑。因为运算符机制让实例的用法和外观类似于内置类型,可以让有些类提供一致而自然的接口,从而可以与预期的内置类型的代码兼容。

[1]如果你使用过C++或Java,就知道Python的self相当于this,但是Python中的self一定是明确写出的,这样使属性的读取更为明显。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文