Python继承的特点与优点:代码复用、减少代码量及初始化父类方法详解
python继承的特点:

总是从某个类继承。
如果没有继承类,则继承自基类object类
python继承的优点:
实现代码复用,减少代码量;
拥有父类的所有功能,只需要编写子类附加的功能即可。
python继承类
Student 类需要具备 name 属性和 gender 属性。因为 Person 类中已经包含了这些属性,所以 Student 类可以直接继承。此外,还需要新增一个 score 属性。
class Person(object):
初始化自身,传入姓名和性别这两个参数。 其中,姓名作为一个参数传入。 性别也作为一个参数传入。 这两个参数用于初始化自身的相关属性或状态。
self.name = name
self.gender = gender
class Student(Person):
self 的初始化函数接收三个参数,分别是 name、gender 和 score。
Student 的父类的初始化方法被调用,传入了 name 和 gender 两个参数。具体来说,是调用了 super(Student, self) 的 __init__ 方法,并将 name 和 gender 作为参数传递进去。
self.score = score
继承类时需使用 super(子类名, self).__init__(子类需继承父类的参数)来初始化父类。若不这样做,继承父类的子类就不会有 name 和 gender。
super(子类名,self)会返回当前类所继承的父类。接着会调用__init__方法。在这个时候,__init__方法不需要再传递 self 参数了,因为在使用 super 时已经传入了。
父类与子类类型
子类类型能够向上转型并被视为父类类型;父类类型不能向下转型并被视为子类类型,原因是子类类型具备一些自身特有的属性和方法。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
调用父类 Student 的构造函数,并传入参数 name 和 gender ,即 self 所代表的对象调用父类的初始化方法。
self.score = score
class Teacher(Person):
初始化自身,传入姓名、性别和课程这三个参数。它会将传入的姓名赋值给自身的某个属性,将性别赋值给另一个属性,将课程赋值给再一个属性。
Teacher 类的父类的构造函数被调用,传入了参数 name 和 gender ,同时 self 也被传递进去了。
self.course = course
创建了一个名为 t 的 Teacher 对象,其姓名为 'Alice',性别为 'Female',教授科目为 'English'。
创建了一个名为 p 的 Person 对象,其名字为“Tim”,性别为“Male”。
打印 isinstance(t, Person) ,结果为 True 。
判断 t 是否为 Student 类型,结果为 False 。 即打印出 t 属于 Student 类型这一判断的结果为 False 。
打印 isinstance(t, Teacher) ,其结果为 True 。
打印 isinstance(t, object) ,结果为 True 。
判断 p 是否是 Student 类型,结果为 False 。 # 打印出 p 与 Student 类型的比较结果,此结果为 False 。 # 检查 p 的类型是否为 Student ,结果显示为 False 。
打印 isinstance(p, Teacher) 的结果,其值为 False。
方法重写
如果一个方法在子类中被定义,且它的名称、返回类型以及参数列表恰好与父类中某一个方法的名称、返回类型以及参数列表相契合,那么就可以表明,子类的这个方法对父类的方法进行了重写。
方法重写在不同类,是实现多态的必要条件。
python多态
(关于多态的内容,本人理解的有偏差)
多态性是以继承为基础的。从一个父类中派生出多个子类,这样就能让子类之间呈现出不同的行为,而这种不同的行为就被称作多态。直白地讲,就是子类对父类的方法进行重写,从而使子类拥有不同的方法实现。
子类和父类拥有同一个方法,子类的方法优先级比父类高,意味着子类覆盖了父类。只要有这个方法,并且参数正确,就能够进行调用。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
返回 '我是一个人,我的名字是 %s' % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
我是一名学生,我的名字是 self.name ,返回的是 'I am a Student, my name is %s' % self.name 这句话
创建了一个名为 p 的 Person 对象,其姓名为'Tim',性别为'Male'。
创建了一个名为 s 的学生对象,其姓名为“Bob”,性别为“Male”,成绩为 88 。
方法调用会作用于 x 的实际类型。s 属于 Student 类型,它自身拥有 whoAmI()方法,同时也从 Person 类继承了 whoAmI 方法。当调用 s.whoAmI()时,总是会先在 s 自身去查找其定义,如果 s 自身没有定义该方法,就会沿着继承链向上查找,一直找到某个父类中存在该方法为止。这就是所谓的多态。
python 存在多重继承这种特性。其目的在于能够从两种不同的继承树当中,分别挑选出所需的部分并将其继承下来,从而让子类可以组合各种功能并加以使用。
class A(object):
def __init__(self, a):
print 'init A...'
self.a = a
class B(A):
def __init__(self, a):
super(B, self).__init__(a)
print 'init B...'
class C(A):
def __init__(self, a):
super(C, self).__init__(a)
print 'init C...'
class D(B, C):
def __init__(self, a):
super(D, self).__init__(a)
print 'init D...'
D继承自 B 且继承自 C,B 继承自 A,C 也继承自 A,所以 D 具备了 A、B 和 C 的全部功能。倘若不存在多重继承,那么就必须在 D 中写入 A、B、C 的所有功能。
继承、方法重写和多态之间存在着紧密的联系,需要对它们之间的关系有深刻的理解,同时也需要持续地进行实践。
有误望大家积极指正我哦~~