前言
跟着廖雪峰老师动手敲一敲,都是很简单易懂的例子。
一、遗传
从原有Class直接继承的Class为子类,原Class为父类。子类可以直接继承方法函数,相同方法函数可覆盖,还可增设新的方法函数。
例如:
class Animal(object):#父类
def run(self):
print('Animal is running...')
class Dog(Animal):#子类
pass
class Cat(Animal):#改变或增加功能
def run(self):
print('Cat is running...')#函数相同时,子类会覆盖父类
def eat(self):
print('Eating meat...')
a=Dog( )
c=Cat( )
a.run()
c.run()
c.eat()
运行结果:
Animal is running...
Cat is running...
Eating meat...
二、多态
1.子类类型不唯一
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来是不成立的。
例如:
class Animal(object):#父类
def run(self):
print('Animal is running...')
class Dog(Animal):#子类
pass
class Cat(Animal):
def run(self):
print('Cat is running...')
a=Dog( )
c=Cat( )
b=Animal()
print(isinstance(c,Cat),isinstance(c,Animal))#子类本就是父类的一种,所以c的类型有两种,isinstance()返回的是布尔值,判断类型是否一致
print(isinstance(b,Animal),isinstance(b,Cat))#但反之则不成立
运行结果:
True True
True False
2.开闭原则
我们用新增一个自定义函数和一个子类来解释经典的“开闭原则”:
class Animal(object):#父类
def run(self):
print('Animal is running...')
class Dog(Animal):#子类
pass
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
def run_twice(animal):
animal.run()
animal.run()
a=Dog( )
b=Animal( )
d=Tortoise( )
run_twice(b)
run_twice(a)
run_twice(d)
运行结果:
Animal is running...
Animal is running...
Animal is running...
Animal is running...
Tortoise is running slowly...
Tortoise is running slowly...
开闭原则:
-
对扩展开放:允许新增Animal子类;
-
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。
3.继承树
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:
4.鸭子类型
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
在动态语言中,我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。Python的“file-like object“就是一种鸭子类型。
就像:
class Animal(object):#父类
def run(self):
print('Animal is running...')
def run_twice(animal):
animal.run()
animal.run()
class Car(object):#并不是Animal的子类
def run(self):#我们只需要保证传入的对象有一个run()方法就可以了
print('Car is running rapidly')
e=Car()
run_twice(e)
运行结果:
Car is running rapidly
Car is running rapidly
再举个栗子,这个又容易理解一些:比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器…动态语言的魅力!!!
总结
争取把面向对象的高级用法在端午之前搞完。