zoukankan      html  css  js  c++  java
  • 面向对象三大特性之继承

    一、什么是面向对象的继承

    官方的说法:是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。

    字面意思就是:子承父业,合法继承家产,就是如果你是独生子,而且你也很孝顺,不出意外,你会继承你父母所有家产,他们的所有财产都会由你使用(败家子儿除外)。

    举个栗子:

    class Person:
        def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Cat:
        def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Dog:
        def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex
    
    # 继承的用法:
    class Aniaml(object):
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
    
    class Person(Aniaml):
        pass
    
    class Cat(Aniaml):
        pass
    
    class Dog(Aniaml):
        pass

    继承的优点也是显而易见的:

    1,增加了类的耦合性(耦合性不宜多,宜精)。

    2,减少了重复代码。

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

    二、继承的分类

    上面的例子:

    Aminal 叫做父类,基类,超类。
    Person Cat Dog: 子类,派生类。
    继承:可以分单继承,多继承

    这里需要补充一下python中类的种类(继承需要):

    在python2x版本中存在两种类.:
      ⼀个叫经典类. 在python2.2之前. ⼀直使⽤的是经典类. 经典类在基类的根如果没有什么都不写. #  深度优先
      ⼀个叫新式类. 在python2.2之后出现了新式类. 新式类的特点是基类的根是object类。 # 广度优先
    python3x版本中只有一种类:
    python3中使⽤的都是新式类. 如果基类谁都不继承. 那这个类会默认继承 object

    三、单继承

    1、类名、对象执行父类的方法

    class Aniaml(object):
        type_name = '动物类'
    
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print(self)
            print('吃东西')
    
    
    class Person(Aniaml):
        pass
    
    
    class Cat(Aniaml):
        pass
    
    
    class Dog(Aniaml):
        pass
    
    # 类名:
    print(Person.type_name)  # 可以调用父类的属性,方法。
    Person.eat(111)
    print(Person.type_name)
    
    # 对象:
    # 实例化对象
    p1 = Person('春哥','',18)
    print(p1.__dict__)
    # 对象执行类的父类的属性,方法。
    print(p1.type_name)
    p1.type_name = '666'
    print(p1)
    p1.eat()

    2、执行顺序 

    class Aniaml(object):
        type_name = '动物类'
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print(self)
            print('吃东西')
    
    class Person(Aniaml):
        
        def eat(self):
            print('%s 吃饭'%self.name)
            
    class Cat(Aniaml):
        pass
    
    class Dog(Aniaml):
        pass
    
    p1 = Person('barry','',18)
    # 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。
    p1.eat()
    # 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

    3、同时想执行类中以及父类中的方法

    方法一:

    如果想执行父类的func方法,这个方法并且子类中也用,那么就在子类的方法中写上:

    父类.func(对象,其他参数)

    举例说明:

    class Aniaml(object):
        type_name = '动物类'
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print('吃东西')
    
    class Person(Aniaml):
        def __init__(self,name,sex,age,mind):
            '''
            self = p1
            name = '春哥'
            sex = 'laddboy'
            age = 18
            mind = '有思想'
            '''
            # Aniaml.__init__(self,name,sex,age)  # 方法一
            self.mind = mind
    
        def eat(self):
            super().eat()
            print('%s 吃饭'%self.name)
    class Cat(Aniaml):
        pass
    
    class Dog(Aniaml):
        pass
    
    # 方法一: Aniaml.__init__(self,name,sex,age)
    # p1 = Person('春哥','laddboy',18,'有思想')
    # print(p1.__dict__)
    
    # 对于方法一如果不理解:
    # def func(self):
    #     print(self)
    # self = 3
    # func(self)

    方法二:

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

    class Aniaml(object):
        type_name = '动物类'
        def __init__(self,name,sex,age):
                self.name = name
                self.age = age
                self.sex = sex
    
        def eat(self):
            print('吃东西')
    
    class Person(Aniaml):
        def __init__(self,name,sex,age,mind):
            '''
            self = p1
            name = '春哥'
            sex = 'laddboy'
            age = 18
            mind = '有思想'
            '''
            # super(Person,self).__init__(name,sex,age)  # 方法二
            super().__init__(name,sex,age)  # 方法二
            self.mind = mind
    
        def eat(self):
            super().eat()
            print('%s 吃饭'%self.name)
    class Cat(Aniaml):
        pass
    
    class Dog(Aniaml):
        pass
    # p1 = Person('春哥','laddboy',18,'有思想')
    # print(p1.__dict__)

    四、多继承、

    class ShenXian: # 神仙
        def fei(self):
            print("神仙都会⻜")
    class Monkey: #
        def chitao(self):
            print("猴⼦喜欢吃桃⼦")
    class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
        pass
    sxz = SunWukong() # 孙悟空
    sxz.chitao() # 会吃桃⼦
    sxz.fei() # 会⻜

    此时, 孙悟空是⼀只猴⼦, 同时也是⼀个神仙. 那孙悟空继承了这两个类. 孙悟空⾃然就可以执⾏这两个类中的⽅法. 多继承⽤起来简单. 也很好理解.

  • 相关阅读:
    在CentOS7上搭建MySQL主从复制与读写分离
    数据库 引擎
    数据库 事务
    数据库 索引
    MYSQL
    基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
    09 引导过程与故障修复
    chapter 8.3
    作业 8.1
    Chapter 04 作业
  • 原文地址:https://www.cnblogs.com/youhongliang/p/12233212.html
Copyright © 2011-2022 走看看