python之面向对象中的多态
直接看代码: class Dog: def __init__(self,name): self.name = name def play(self): print("%s在汪汪汪" % self.name) SonDog(Dog): def play(self): print(%s不仅会汪,还会飞 Person: def __init__(self,1)"> name def game(self,dog): print(%s正在和%s快乐地做游戏 (self.name,dog.name)) dog.play() wc = Dog(旺财") p = Person(妞妞) p.game(wc) 输出: 说明:SonDog继承了Dog,并重写了play方法 。在Person类中,game方法需要传入一个Dog的实例。 假设我们传给game的不是Dog类,而是其子类,那么效果又是怎么样的呢? # wc = Dog() sonWc = SonDog(旺财儿子) p.game(sonWc) 输出: 我们发现,调用的是子类的play方法。 在python中,多态体现得没那么明显。我们可以将其展开来看。python是一门动态语言,不需要指定变量的类型,会在运行阶段自动判别变量的类型。因此,对于某个类而言,在实例化时,不需要指定它是什么类,比如说在java中有Dog这么一个类,在新建它的实例时,都会使用Dog dog = new Dog(),而在python中只需要dog = Dog()。 而所谓的多态,就是父类的引用指向子类的对象,拿java举例:SonDog继承了Dog,在实例化时Dog dog = new SonDog(),这就体现了一种多态性。为什么这么说?假设有多个不同的子类继承了该类,那么,该父类的引用指向不同子类的实例,就可以实现不同的功能。这就是多态的思想。 再拿本段代码而言,在Person类中的game方法,需要传入的是一个Dog对象(python并不用显示的指定它的类型),当传入wc时很好理解,但是,为什么还可以传入sonWc?之前也说过了,可以这么理解:Dog sonWc = new SonDog("旺财儿子"),这不就是父类的引用指向子类的对象了么。子类重写了父类的play方法,在调用时,会调用子类的play方法。 那么,假设父类中有而子类没有,子类中有而父类中没有的方法会怎么样呢? self.name) def test1(self): print(父类的test1方法) self.name) def test2(self): print(子类的test2方法) p.game(sonWc) 输出: 假设,我们传入的就是父类的实例: wc = Dog() # sonWc = SonDog() p.game(wc) 输出: 父类就访问不到子类的特有的方法。 讲这么一个是为了说明什么,多态使得父类可以访问到子类的方法和属性,虽然在python中并不显得那么明显。 总结:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |