python类的继承与多态

python继承的特点:

总是从某个类继承。

如果没有继承类,则继承自基类object类

python继承的优点:

实现代码复用,减少代码量;

拥有父类的所有功能,只需要编写子类附加的功能即可。

python继承类

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

方法重写

如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。

方法重写在不同类,是实现多态的必要条件。

python多态

(关于多态的内容,本人理解的有偏差)

多态性依赖于继承。从一个父类派生出多个子类,可以使子类之间有不同的行为,这种行为称之为多态。更直白的说,就是子类重写父类的方法,使子类具有不同的方法实现。

子类与父类拥有同一个方法,子类的方法优先级高于父类,即子类覆盖父类。只要方法存在,参数正确,就可以调用。

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()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。这就称之为多态。

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和C又继承自A,因此D拥有了A、B和C的全部功能。如果没有多重继承,就需要在D里写A、B、C的所有功能进去。

继承、方法重写、多态之间有着千丝万缕的关系,需要深刻理解它们之间的关系,还需要不断的实践。

有误望大家积极指正我哦~~

猜你喜欢

转载自blog.csdn.net/loner_fang/article/details/80895151