总是从某个类继承。
如果没有继承类,则继承自基类object类
实现代码复用,减少代码量;
拥有父类的所有功能,只需要编写子类附加的功能即可。
Student类需要有name和gender属性,因为Person类中有所以直接继承即可。另外需要新增score属性。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
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):
super(Student, self).__init__(name, gender)
self.score = score
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
t = Teacher('Alice', 'Female', 'English')
p = Person('Tim','Male')
print isinstance(t,Person) # True
print isinstance(t,Student) # False
print isinstance(t,Teacher) # True
print isinstance(t,object) # True
print isinstance(p,Student) # False
print isinstance(p,Teacher) # False
如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。
方法重写在不同类,是实现多态的必要条件。
(关于多态的内容,本人理解的有偏差)
多态性依赖于继承。从一个父类派生出多个子类,可以使子类之间有不同的行为,这种行为称之为多态。更直白的说,就是子类重写父类的方法,使子类具有不同的方法实现。
子类与父类拥有同一个方法,子类的方法优先级高于父类,即子类覆盖父类。只要方法存在,参数正确,就可以调用。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return 'I am a Person, my name is %s' % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return 'I am a Student, my name is %s' % self.name
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
who_am_i(p) # I am a Person, my name is Tim
who_am_i(s) # I am a Student, my name is Bob
方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。这就称之为多态。
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和C又继承自A,因此D拥有了A、B和C的全部功能。如果没有多重继承,就需要在D里写A、B、C的所有功能进去。
继承、方法重写、多态之间有着千丝万缕的关系,需要深刻理解它们之间的关系,还需要不断的实践。
有误望大家积极指正我哦~~