python类的继承和多态 ——简单学习与了解

本文详细介绍了Python中的继承和多态概念。通过实例展示了如何使用继承来让子类继承父类的功能,以及如何利用多态实现不同子类中相同方法的不同实现。多态允许我们在不关心具体类型的情况下调用方法,增强了代码的灵活性和可扩展性。文中还探讨了多态带来的好处,特别是在编写函数时,能够接受不同类型的参数,提高了代码的复用性。
摘要由CSDN通过智能技术生成

1.继承

效果:子类获得父类的全部功能。

使用方法:在定义类的括号中(object),object表示该类是从哪个类继承下来的,在object中填入需要继承的类(父类)的名字,就可以继承父类的全部功能了。

注意:如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

具体实践:

class Animal(object):    def run(self):        print('Animals is running...')class Dog(Animal):    pass#新建一个实例dog = Dog()#这样子类Dog就可以使用父类的方法了dog.run()
Animals is running...

从上面可以看出:由于Animial有run()方法,Dog作为它的子类,什么事也没干,就自动拥有了run()方法。

 

2.多态

说白了:多态就是子类有个跟父类的一模一样方法名,方法内容不同。这样可以使得子类具有不同的方法实现。

对子类Dog()增加相同的方法run():

class Dog(Animal):    def run(self):        print('Dog is running...')

当子类和父类都存在相同的run()方法时,子类的run()会覆盖父类的run()方法,在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态

注意:多态首先是建立在继承的基础上的,先有继承才能有多态。

class Animal(object):    def run(self):        print('Animals is running...')class Dog(Animal):    def run(self):        print('Dog is running...')#新建一个实例dog = Dog()#这样子类Dog就可以使用父类的方法了dog.run()
Dog is running...

要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型

查看数据类型可以用type()方法和isinstance()方法

print type(())print type([])print type('aaa')print type(Animal())print type(Dog())
<type 'tuple'><type 'list'><type 'str'><class '__main__.Animal'><class '__main__.Dog'>

新建两个实例,判断其数据类型

class Animal(object):    def run(self):        print('Animals is running...')class Dog(Animal):    def run(self):        print('Dog is running...')a=Animal()b=Dog()#判断一个变量是否是某个类型可以用isinstance()判断print isinstance(a,Animal)print isinstance(b,Dog)print isinstance(b,Animal)
TrueTrueTrue

从运行结果可以看出,b的数据类型既是Dog,也是Animal。因为DogAnimal的子类。

所以,在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行。Dog可以看成Animal,但Animal不可以看成Dog



说了这么多,多态有什么好处呢?

举个例子:编写一个函数,这个函数接受一个Animal类型的变量

class Animal(object):    def run(self):        print('Animals is running...')class Dog(Animal):    def run(self):        print('Dog is running...')class Cat(Animal):    def run(self):        print('Cat is running...')def run_twice(animal):    animal.run()    animal.run()#传入Animalrun_twice(Animal())run_twice(Dog())run_twice(Cat())

运行结果: 

Animals is running...Animals is running...Dog is running...Dog is running...Cat is running...Cat is running...

从上面结果可以看到:

       对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法。而具体调用的run()方法是作用在AnimalDogCat对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值