python类的继承,如果一种语言不支持继承就,“类”就没有什么意义。派生类的定义如下所示:
class DerivedClassName(BaseClassName): <statement-1> . . <statement-N>
命名 BaseClassName
(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
派生类定义的执行过程和基类是一样的。构造派生类对象时,就记住了基类。这在解析属性引用的时候尤其有用:如果在类中找不到请求调用的属性,就搜索基类。如果基类是由别的类派生而来,这个规则会递归的应用上去。
派生类的实例化没有什么特殊之处: DerivedClassName()
(示列中的派生类)创建一个新的类实例。方法引用按如下规则解析:搜索对应的类属性,必要时沿基类链逐级搜索,如果找到了函数对象这个方法引用就是合法的。
派生类可能会覆盖其基类的方法。因为方法调用同一个对象中的其它方法时没有特权,基类的方法调用同一个基类的方法时,可能实际上最终调用了派生类中的覆盖方法(对于 C++ 程序员来说,Python 中的所有方法本质上都是 虚
方法)。
派生类中的覆盖方法可能是想要扩充而不是简单的替代基类中的重名方法。有一个简单的方法可以直接调用基类方法,只要调用:BaseClassName.methodname(self, arguments)
。有时这对于客户也很有用(要注意只有 BaseClassName
在同一全局作用域定义或导入时才能这样用)。
Python 有两个用于继承的函数:
- 函数 isinstance() 用于检查实例类型:
isinstance(obj, int)
只有在obj.__class__
是 int 或其它从 int 继承的类型 - 函数 issubclass() 用于检查类继承:
issubclass(bool, int)
为True
,因为 bool 是 int 的子类。但是,issubclass(unicode, str)
是False
,因为 unicode 不是 str 的子类(它们只是共享一个通用祖先类 basestring )。