Python基础(10)-面向对象编程-(继承和多态)

继承

当定义一个class时,从现有的class继承,新的class叫做子类,被继承的成为父类。
比如:

class Animal(object):
    def run(self):
        print('%s is runing...'%self)
class Dog(Animal):
    pass
class Cat(Animal):
    pass

子类继承了父类所有的方法和属性。子类的实例,子类的方法优先级高于父类的优先级。

多态

当一个类有父类时,其子类的实例不仅仅是子类的数据类型,还是父类的数据类型。
作用:
当外部函数,其参数时父类的类型时,也可以传入任何继承于它的子类的实例,运行仍然成功。好处就是不需要更改函数的参数。
开闭原则:
1. 对扩展开放,允许新增子类
2. 对修改封闭,不需要修改依赖父类类型的函数,因为子类实例依然可用
注意:和C++不一样的是,对于Python动态语言,不一定需要传入Animal类型,只需要保证传入的对象有一个run()方法就行,这就是“鸭子类型”
如下:

class Animal(object):
    def run(self):
        print('Animal is runing...')
class Dog(Animal):
    pass
class Run(object):
    def run(self):
        print('Run is running!')
def fun(Animal):
    Animal.run()

以上代码中,fun()函数的参数时Animal类型,Dog类继承Animal,而Run类并不是Animal的子类,当Run的实例调用函数fun()会出错吗?执行结果如下:

>>> a=Run()
>>> a
<__main__.Run object at 0x000001CB8F734AC8>
>>> a.run()
Run is running!
>>> fun(a)
Run is running!

可以看出,虽然a并不是Animal类型的,但是因为类中有run()函数,所以fun()函数依然可以使用该类的实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值