• 沒有找到結果。

继承与多态

在文檔中 数据结构与算法 (頁 71-99)

继承与多态

在 OOP 中定义一个 class 时,可以从某个现有的 class 继承,新的 class 称为子类 (subclass),而被继承的 class 称为基类、父类或超类 (base class、super class)。

30

继承与多态

继承与多态

继承与多态

继承有什么好处呢?

最大的好处就是子类获得了父类的全部功能。  由于Animial实现了run(),Dog和Cat作为它的子类,什么事也没干, 就自动拥有了run():

dog = Dog () dog . run () cat = Cat () cat . run ()

A n i m a l is r u n n i n g ... A n i m a l is r u n n i n g ...

32

继承与多态

继承有什么好处呢?最大的好处就是子类获得了父类的全部功能。 

由于Animial实现了run(),Dog和Cat作为它的子类,什么事也没干, 就自动拥有了run():

dog = Dog () dog . run () cat = Cat () cat . run ()

A n i m a l is r u n n i n g ... A n i m a l is r u n n i n g ...

32

继承与多态

继承有什么好处呢?最大的好处就是子类获得了父类的全部功能。 

由于Animial实现了run(),Dog和Cat作为它的子类,什么事也没干,

就自动拥有了run():

dog = Dog () dog . run () cat = Cat () cat . run ()

A n i m a l is r u n n i n g ... A n i m a l is r u n n i n g ...

32

继承与多态

继承有什么好处呢?最大的好处就是子类获得了父类的全部功能。 

由于Animial实现了run(),Dog和Cat作为它的子类,什么事也没干,

就自动拥有了run():

dog = Dog () dog . run () cat = Cat () cat . run ()

A n i m a l is r u n n i n g ...

A n i m a l is r u n n i n g ...

32

继承与多态

也可以为子类增加一些方法

例:

c l a s s Dog ( A n i m a l ) : def eat ( s e l f ) :

p r i n t( ’ E a t i n g m e a t ... ’ ) dog = Dog ()

dog . run () dog . eat ()

A n i m a l is r u n n i n g ... E a t i n g m e a t ...

33

继承与多态

也可以为子类增加一些方法

例:

c l a s s Dog ( A n i m a l ) : def eat ( s e l f ) :

p r i n t( ’ E a t i n g m e a t ... ’ ) dog = Dog ()

dog . run () dog . eat ()

A n i m a l is r u n n i n g ... E a t i n g m e a t ...

33

继承与多态

也可以为子类增加一些方法

例:

c l a s s Dog ( A n i m a l ) : def eat ( s e l f ) :

p r i n t( ’ E a t i n g m e a t ... ’ ) dog = Dog ()

dog . run () dog . eat ()

A n i m a l is r u n n i n g ...

E a t i n g m e a t ...

33

继承与多态

继承的第二个好处是可以改进代码.

前面可以看到,无论是Dog还是Cat,调用run()时,显示的都 是Animal is running...,符合逻辑的做法是分别显 示Dog is running...和Cat is running....

34

继承与多态

继承的第二个好处是可以改进代码.

前面可以看到,无论是Dog还是Cat,调用run()时,显示的都 是Animal is running...,符合逻辑的做法是分别显 示Dog is running...和Cat is running....

34

继承与多态

继承与多态

继承与多态

继承与多态

要理解什么是多态,先要对数据类型作一些说明。

定义一个 class,实际上就定义了一种新的数据类型。

自定义的数据类型和 Python 内置的数据类型 (如str, list, dict等) 没什么两样:

a = l i s t() b = A n i m a l () c = Dog ()

36

继承与多态

要理解什么是多态,先要对数据类型作一些说明。

定义一个 class,实际上就定义了一种新的数据类型。

自定义的数据类型和 Python 内置的数据类型 (如str, list, dict等) 没什么两样:

a = l i s t() b = A n i m a l () c = Dog ()

36

继承与多态

要理解什么是多态,先要对数据类型作一些说明。

定义一个 class,实际上就定义了一种新的数据类型。

自定义的数据类型和 Python 内置的数据类型 (如str, list, dict等) 没什么两样:

a = l i s t() b = A n i m a l () c = Dog ()

36

继承与多态

判断一个变量是否是某个类型可以用 isinstance():

p r i n t(i s i n s t a n c e( a , li s t) ) p r i n t(i s i n s t a n c e( b , A n i m a l ) ) p r i n t(i s i n s t a n c e( c , Dog ) ) p r i n t(i s i n s t a n c e( c , A n i m a l ) ) T r u e

T r u e T r u e T r u e

a, b, c分别是list, Animal, Dog类型,但c还是Animal类型.

37

继承与多态

在继承关系中,如果一个实例的数据类型是某个子类,则它的数据类 型也可看做是其父类,但反过来不行:

p r i n t(i s i n s t a n c e( b , Dog ) ) F a l s e

38

继承与多态

继承与多态

继承与多态

继承与多态

多态的含义

对于一个变量,只需要知道它是Animal类型,无需确切地知道它 的子类型,就可以放心地调用run()方法,而具体调用的run()方 法是作用在Animal, Dog还是Cat对象上,由运行时该对象的确切 类型决定,这就是多态真正的威力.

调用方只管调用,不管细节.当新增一种 Animal 的子类时,只要 确保run()方法编写正确,不用管原来的代码是如何调用的。 这 就是著名的“开闭”原则.

40

继承与多态

多态的含义

对于一个变量,只需要知道它是Animal类型,无需确切地知道它 的子类型,就可以放心地调用run()方法,而具体调用的run()方 法是作用在Animal, Dog还是Cat对象上,由运行时该对象的确切 类型决定,这就是多态真正的威力.

调用方只管调用,不管细节.当新增一种 Animal 的子类时,只要 确保run()方法编写正确,不用管原来的代码是如何调用的。 这 就是著名的“开闭”原则.

40

继承与多态

“开闭”原则

• 对扩展开放:允许新增Animal子类;

• 对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

41

继承与多态

继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这 样的关系。而任何类,最终都可以追溯到根类 object,这些继承关系看 上去就像一颗倒着的树。比如如下的继承树:

42

在文檔中 数据结构与算法 (頁 71-99)

相關文件