python3中的继承和多态
*继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为
def run(self): print(‘Animal is running...‘)
class Dog(Animal): pass class Cat(Animal): pass
对于 继承有什么好处?最大的好处是子类获得了父类的全部功能。由于 如下所示
class Cat(Animal): def run(self): print(‘Dog is running...‘) def eat(self): print(‘Eating meat...‘)
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:
要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样: a = list() # a是list类型 b = Animal() # b是Animal类型 c = Dog() # c是Dog类型
判断一个变量是否是某个类型可以用 >>> isinstance(a,list) True >>> isinstance(b,Animal) True >>> isinstance(c,Dog) True
看来 但是等等,试试: >>> isinstance(c,Animal) True
看来 不过仔细想想,这是有道理的,因为 所以,在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行: >>> b = Animal() >>> isinstance(b,Dog) False
要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个 def run_twice(animal): animal.run() animal.run()
当我们传入 >>> run_twice(Animal()) Animal is running... Animal is running...
当我们传入 >>> run_twice(Dog()) Dog is running... Dog is running...
当我们传入 >>> run_twice(Cat()) Cat is running... Cat is running...
看上去没啥意思,但是仔细想想,现在,如果我们再定义一个 class Tortoise(Animal): def run(self): print(‘Tortoise is running slowly...‘)
当我们调用 >>> run_twice(Tortoise()) Tortoise is running slowly... Tortoise is running slowly...
你会发现,新增一个 多态的好处就是,当我们需要传入 ? *动态语言与静态语言的区别 静态语言 对于静态语言(例如Java)来说,如果需要传入 动态语言 对于Python这样的动态语言来说,则不一定需要传入 这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。 就是说只要有一个方面相似,就能继承。 小结:继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |