本文学习Python的笔记,仅供参考
继承
熟悉C++的都应该了解继承了,简单的说一个类继承另外一个类, 可以获得继承类的属性和方法,继承的类称为子类,被继承的类称为父类,比如说人类算是非常大的一个类了,如果按照职业分可能会分为学生类,教师类,工程师类等,其实人类一些共有的属性,学生类和教师类都有,所以学生类完全就可以继承人类,拥有公用的属性。
下面我写了一个Person类,这个类有一个run方法,有一个Student类这个类什么都没有,继承与Person类,可以看到object变成父类的名字即可完成继承。
class Person(object):
def run(self):
print("Persion is running")
class Student(Person):
pass
看下子类是否能继承父类的方法:
>>> b = Student()
>>> b.run()
Persion is running
OK , 可以看到调用子类run方法,因为子类没有,就执行的父类的run方法。
从此可以看出,子类获取了父类的功能,这样可以节约代码了
当然假设Student 有自己的方法呢?会是什么样子,可以尝试一下:
>>> class Student(Person):
def run(self):
print("Student is running")
>>> c = Student()
>>> c.run()
Student is running
可以看到如果Student有自己的run方法,那么就 执行自己的。
也就是说当子类和父类有相同的方法的时候,也称为子类的run()方法覆盖了父类的方法的时候,就会自动调用子类的方法,这也是继承的另一个好处,多态。
多态
1. 任何以父类作为参数的函数,在不用修改的前提下子类都可以正常运行,也就是说我们如果传入很多子类的时候比如Student,Teacher等,我们只需要接收Person这个类型即可, 原则上子类可以向上转型为父类的类型。
2,.对于一个变量,我们无需知道属于哪个子类,但是如果知道属于哪个父类,那么我们可以完全的去调用父类的方法,由于多态,肯定能找到对应子类的方法。
OK 我们用实例验证下2点,第一点我们写一个函数参数是Person
class Person(object):
def run(self):
print("Persion is running")
class Student(Person):
def run(self):
print("Student is running")
def run_man(person):
person.run()
person.run()
run_man(Person())
run_man(Student())
可以看到run_man是person类的变量,但是我们在运行子类的时候,仍可以动态的找到子类的函数,并且不用修改run_man就兼容父类子类。
======================== RESTART: E:/python/person.py ========================
Persion is running
Persion is running
Student is running
Student is running
多重继承
其实这个挺容易理解的,比如动物可以分为哺乳类和鸟类,然后根据能跑和能飞,又要进行一次分类,对于狗,可以归属于哺乳类和能跑的。其实多重继承就可以完成这个功能:
class Runnable(object):
def run(self):
print('Running...')
class Flyable(object):
def fly(self):
print('Flying...')
能飞和能跑的类,然后还有一个哺乳类和鸟类
class Animal(object):
pass
# 大类:
class Mammal(Animal):
pass
class Bird(Animal):
pass
如果定义一个Dog类,则可以继承Mammal类和Runnable类
class Dog(Mammal, Runnable):
pass
OK ,这样Dog就继承了Mammal和Runnable的功能。