继承
当定义一个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()
函数依然可以使用该类的实例。