Python
学习笔记(四)
Python
在尽可能不增加新的语法和语义的情况下加入了类机制。这种机制是
C++
和
Modula-3
的混合。
Python
中的类没有在用户和定义之间建立一个绝对的屏障,而是依赖于用户自觉的不去
“
破坏定义
”
。然而,类机制最重要的功能都完整的保留下来。类继承机制允许多继承,派生类可以覆盖(
override
)基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量的私有成员。
在
Python
中
“
对象
”
这个词不一定指类实例。
Python
中并非所有的类型都是类:例如整型、链表这些内置数据类型就不是,甚至某些像文件这样的外部类型也不是,这一点类似于
C++
和
Modula-3
,而不像
Smalltalk
。然而,所有的
Python
类型在语义上都有一点相同之处:描述它们的最贴切词语是
“
对象
”
。
对象是被特化的,多个名字(在多个作用域中)可以绑定同一个对象。这相当于其它语言中的别名。通常对
Python
的第一印象中会忽略这一点,使用那些不可变的基本类型(数值、字符串、元组)时也可以很放心的忽视它。然而,在
Python
代码调用字典、链表之类可变对象,以及大多数涉及程序外部实体(文件、窗体等等)的类型时,这一语义就会有影响。这通用有助于优化程序,因为别名的行为在某些方面类似于指针。例如,很容易传递一个对象,因为在行为上只是传递了一个指针。如果函数修改了一个通过参数传递的对象,调用者可以接收到变化--在
Pascal
中这需要两个不同的参数传递机制。
下面程序说话:
class MyClass:
"A simple example class"
i = 12345
def f(self):
return 'hello world'
那么
MyClass.i
和
MyClass.f
是有效的属性引用,分别返回一个整数和一个方法对象。也可以对类属性赋值,你可以通过给
MyClass.i
赋值来修改它。
__doc__
也是一个有效的属性,返回类的文档字符串:
"A simple example class"
。
不过多数情况加上
__init__
函数。类似构造函数。第一个参数一般
self
,为其自身。
派生类可能会覆盖其基类的方法。因为方法调用同一个对象中的其它方法时没有特权,基类的方法调用同一个基类的方法时,可能实际上最终调用了派生类中的覆盖方法。(对于
C++
程序员来说,
Python
中的所有方法本质上都是虚方法。)
派生类中的覆盖方法可能是想要扩充而不是简单的替代基类中的重名方法。有一个简单的方法可以直接调用基类方法,只要调用:
"BaseClassName.methodname(self, arguments)"
。有时这对于客户也很有用。(要注意的中只有基类在同一全局作用域定义或导入时才能这样用。)
Python
同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
这里唯一需要解释的语义是解析类属性的规则。顺序是深度优先,从左到右。因此,如果在
DerivedClassName
(示例中的派生类)中没有找到某个属性,就会搜索
Base1
,然后(递归的)搜索其基类,如果最终没有找到,就搜索
Base2
,以此类推。
小漏洞:派生类和基类取相同的名字就可以使用基类的私有变量。
posted on 2008-04-10 15:48
-274°C 阅读(630)
评论(0) 编辑 收藏 所属分类:
python