Jython的继承
类继承的能力是面向对象编程的基础。Jython 支持单继承和多继承。单继承 意味只有一个父类,多继承 意味着可以有多个父类。
继承是通过派生其他类实现的。这些类可以是其他 Jython 类,也可以是 Java 类。可以从任何数量的纯 Jython 类或者 Java 实例派生,但是只能(直接或者间接)继承一个 Java 类。不需要提供一个父类。
父类中的所有属性或者方法都存在于所有子类中,并可以被类自身或者所有客户使用(假定它是 publicly 变量)。在可以使用父类的实例的所有地方都可以使用子类的所有实例 ―― 下面是 多态 的一个例子。这些功能使重用、快速开发和容易扩展成为可能。
下面是一些继承的例子:
- class Class1: pass # no inheritance
- class Class2: pass
- class Class3(Class1): pass # single inheritance
- class Class4(Class3,Class2): pass # multiple inheritance
- from java import awt
- from java import io
- # inherit a Java class and interface and a Jython class
- class MyPanel(awt.Panel, io.Serializable, Class2):
- :
Jython的继承——将类作为值使用
还可以将类赋值给变量(包括函数参数)。这使编写基于类的动态代码相当容易,可以从下面的通用类实例工厂看到这一点:
- def instanceMaker(xclass, *args):
- return apply(xclass, args)
- :
- x = instanceMaker(MyClass) # same as: x = MyClass()
Jython的继承——带继承的 init 方法
子类的 __init__ 方法必须调用其父类定义的所有 __init__ 方法,这不会自动进行。下面的两个例子展示了如何使用带继承的 __init__ 方法。
- class Class1(SuperClass):
- def __init__ (self): # no arguments
- SuperClass.__init__(self) # init my super-class
- self.data = [] # set implicit data
- class Class2(SuperClass):
- def __init__ (self, v1, v2): # 2 required arguments
- SuperClass.__init__(self, v1) # init my super-class with v1
- self.v2 = v2
下面是一些带多继承的初始化的例子:
- class Class1(Super1, Super2):
- def __init__ (self): # no arguments
- Super1.__init__(self) # init each super-class
- Super2.__init__(self)
- self.data = [] # set implicit data
- class Class2(Super1, Super2):
- def __init__ (self, v1, v2, v3): # 3 required arguments
- # note you may do work before calling the super __init__ methods
- self.v3 = v3 # set data from parameter
- Super1.__init__(self, v1) # init each super-class
- Super2.__init__(self, v2)
Jython的继承——调用父类方法
可以使用类名限定调用所有父类方法,如下所示:
- class Class1:
- def method1 (self):
- :
- class Class2(Class1):
- def method1 (self): # override method1
- :
- Class1.method1(self) # call my super-class method
- :
- def method2 (self):
- :
- class Class3(Class2):
- def method1 (self): # override method1
- :
- Class2.method1(self) # call my super-class method
- :
- def method3 (self):
- :
注意,次要的方法定义(在 Class2 和 Class3 中)覆盖了父类定义。不要求子类方法调用其父类方法,不过,如果它不这样做,那么它就必须完整地替换父类方法的函数。
Jython的继承——调用方法
有两种调用方法的语法(假定有一个由变量 mci 引用的 MyClass 实例):
- mci.someMethod(...)
- MyClass.someMethod(mci, ...)
***种形式通常用于类客户编码中,而第二种形式更常用于在子类中调用父类方法。
【编辑推荐】