来源:python中国网 时间:2020-04-06

  继承是一个概念而已,个人觉得继承是一种编程的方法,是人类"懒惰"的体现。

  官方点说:

  1)继承是面向对象当中的一个概念。如果一个类A“继承自”另一个类B,就把这个A称为“B的子类”,而把B称为“A的父类”或者说“B是A的超类”。继承可以使得子类具有父类的属性和方法,避免再次编写相同的代码。

  2)在子类继承父类时,可以重新定义某些属性,重写某些方法,(即覆盖父类原有属性和方法,获得与父类别不同的功能)。也可以为子类追加新的属性和方法。

  3)通常静态的面向对象编程语言,继承属于静态的,(即在子类别的行为在编译期就已经决定,无法在执行期扩充)。

  继承的分类

  1、单继承:一个类只有一个父类

  2、多继承:一个类有多个父类。多继承比较复杂,可能多个父类出现相同的方法,甚至父类还继承了父类等。

  本节课直说简单的单继承。多继承参照python多继承父类同名处理python多继承C3算法

  下面例子中Girls叫做父类,基类,超类。America、Japan、People:子类,派生类。

# -*- coding: utf-8 -*-


class Girls:
    def __init__(self,name,age):
        self.name = name
        self.age = age


class America(Girls):
    def yue_pao(self):
        print("America  {0} 被约...".format(self.name))


class Japan(Girls):
    def yue_pao(self):
        print("Japan {0} 被约...".format(self.name))


class People(Girls):
    def yue_pao(self):
        print("{0} is 约炮...".format(self.name))


if __name__ == "__main__":
    person = People("laowang", 25)
    america = America("老美", 20)
    japan = Japan("日韩", 18)
    person.yue_pao()
    america.yue_pao()
    japan.yue_pao()

laowang is 约炮...
America  老美 被约...
Japan 日韩 被约...

   继承优点:

  1,增加了类的耦合性。

  2,减少了重复代码。

  3,使得代码更加规范化,合理化。

  继承父类的方法&重构

# -*- coding: utf-8 -*-


class Girls:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def say(self):
        print('laowang才能约')


class America(Girls):
    def yue_pao(self):
        print("America  {0} 被约...".format(self.name))


class Japan(Girls):
    def yue_pao(self):
        print("Japan {0} 被约...".format(self.name))
        
    # 重写父类方法
    def say(self):
        print('{} 任何人都能约'.format(self.name))


if __name__ == "__main__":
    japan = Japan("日韩", 18)
    japan.yue_pao()
    japan.say()

Japan 日韩 被约...
日韩 任何人都能约

  同时执行子类&父类的构造方法

  如果子类的init方法中想执行父类的init方法并且在此基础上做一些扩充,比如增加一些其他的属性。一般有2种方法

  1)在子类的构造方法中写上父类名.__init__(子类对象,其他参数)

# -*- coding: utf-8 -*-


class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def say(self):
        print("我是一只{0}我{1}岁了...".format(self.name,self.age))


class Cat(Animal):
    def __init__(self,name,age,sex):
        Animal.__init__(self,name,age) # 先执行父类方法
        self.sex = sex  # 再加上子类的属性
        print("初始化了一个猫叫{0}".format(self.name))

    def say(self,food):
        print("{0}喜欢吃{1}..".format(self.name,food))


if __name__ == "__main__":
    cat = Cat('laowang', 25, '雄性')
    print('子类猫的性别',cat.sex)
    cat.say('老鼠')

初始化了一个猫叫laowang
子类猫的性别 雄性
laowang喜欢吃老鼠..


  2)利用super,super().func(参数)

# -*- coding: utf-8 -*-


class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def say(self):
        print("我是一只{0}我{1}岁了...".format(self.name,self.age))


class Cat(Animal):
    def __init__(self,name,age,sex):
        super(Cat, self).__init__(name, age)
        self.sex = sex  # 加上子类的属性
        print("初始化了一个猫叫{0} 是{1}".format(self.name,self.sex))

    def say(self,food):
        print("{0}喜欢吃{1}..".format(self.name,food))


if __name__ == "__main__":
    cat = Cat('laowang', 25, '雄性')
    print(cat.name)

初始化了一个猫叫laowang 是雄性
laowang