1.1Python 的类机制通过最小的新语法和语义在语言中实现了类。它是 C++ 或者 Modula-3 语言中类机制的混合。就像模块一样,Python 的类并没有在用户和定义之间设立绝对的屏障,而是依赖于用户不去“强行闯入定义”的优雅。另一方面,类的大多数重要特性都被完整地保留下来:类继承机制允许多重继承,派生类可以覆盖(override)基类中的任何方法或类,可以使用相同的方法名称调用基类的方法。对象可以包含任意数量的私有数据。
1.2用 C++ 术语来讲,所有的类成员(包括数据成员)都是公有( public )的(其它情况见下文 私有变量),所有的成员函数都是虚( virtual )的。用 Modula-3 的术语来讲,在成员方法中没有简便的方式引用对象的成员:方法函数在定义时需要以引用的对象作为第一个参数,调用时则会隐式引用对象。像在 Smalltalk 中一个,类也是对象。这就提供了导入和重命名语义。不像 C++ 和 Modula-3 中那样,大多数带有特殊语法的内置 *** 作符(算法运算符、下标等)都可以针对类的需要重新定义。
1.3在讨论类时,没有足够的得到共识的术语,我会偶尔从 Smalltalk 和 C++ 借用一些。我比较喜欢用 Modula-3 的用语,因为比起 C++,Python 的面向对象语法更像它,但是我想很少有读者听过这个。
1.4Python 的类机制通过最小的新语法和语义在语言中实现了类。它是 C++ 或者 Modula-3 语言中类机制的混合。就像模块一样,Python 的类并没有在用户和定义之间设立绝对的屏障,而是依赖于用户不去“强行闯入定义”的优雅。另一方面,类的大多数重要特性都被完整地保留下来:类继承机制允许多重继承,派生类可以覆盖(override)基类中的任何方法或类,可以使用相同的方法名称调用基类的方法。对象可以包含任意数量的私有数据。
1.5用 C++ 术语来讲,所有的类成员(包括数据成员)都是公有( public )的(其它情况见下文 私有变量),所有的成员函数都是虚( virtual )的。用 Modula-3 的术语来讲,在成员方法中没有简便的方式引用对象的成员:方法函数在定义时需要以引用的对象作为第一个参数,调用时则会隐式引用对象。像在 Smalltalk 中一个,类也是对象。这就提供了导入和重命名语义。不像 C++ 和 Modula-3 中那样,大多数带有特殊语法的内置 *** 作符(算法运算符、下标等)都可以针对类的需要重新定义。
1.6在讨论类时,没有足够的得到共识的术语,我会偶尔从 Smalltalk 和 C++ 借用一些。我比较喜欢用 Modula-3 的用语,因为比起 C++,Python 的面向对象语法更像它,但是我想很少有读者听过这个。
类就是把属性和行为封装到一起,被对象后方便使用。类定义就是对类对象的定义。类定义是一条可执行语句。 其中继承列表通常给出基类的列表 (进阶用法请参见 元类),列表中的每一项都应当被求值为一个允许子类的类对象。 没有继承列表的类默认继承自基类 object;随后类体将在一个新的执行帧 (参见 命名与绑定) 中被执行,使用新创建的局部命名空间和原有的全局命名空间。 (通常,类体主要包含函数定义。) 当类体结束执行时,其执行帧将被丢弃而其局部命名空间会被保存。 3 一个类对象随后会被创建,其基类使用给定的继承列表,属性字典使用保存的局部命名空间。 类名称将在原有的全局命名空间中绑定到该类对象。
在类体内定义的属性的顺序保存在新类的 __dict__ 中。 请注意此顺序的可靠性只限于类刚被创建时,并且只适用于使用定义语法所定义的类。
类的创建可使用 元类 进行重度定制。
类也可以被装饰:就像装饰函数一样,:
装饰器表达式的求值规则与函数装饰器相同。 结果随后会被绑定到类名称。
在 3.9 版更改: 类可使用任何有效的 assignment_expression 来装饰。 在之前版本中,此语法则更为受限,
程序员注意事项: 在类定义内定义的变量是类属性;它们将被类实例所共享。 实例属性可通过 self.name = value 在方法中设定。 类和实例属性均可通过 "self.name" 表示法来访问,当通过此方式访问时实例属性会隐藏同名的类属性。 类属性可被用作实例属性的默认值,但在此场景下使用可变值可能导致未预期的结果。 可以使用 描述器 来创建具有不同实现细节的实例变量。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)