• Python3 面向对象之:单继承


    一:什么面向对象的继承?

    比较官方的说法就是:

    继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别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

    三,单继承。

    3.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()

    3.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.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__)


     

     


  • 相关阅读:
    IE里ActiveXObject的一些实践
    JS兼容性问题汇总
    js:apply/call
    mark 一些近来用过的js库
    (转)时序分析基本概念
    (转载) 使用TimeQuest时序分析器
    (转)Altera对应的时序概念
    有序符号表(二叉树实现,JAVA,算法(四))
    有序符号表(数组实现,JAVA,算法(四),二分法)
    无序符号表(链表实现,JAVA,算法(四))
  • 原文地址:https://www.cnblogs.com/YZL2333/p/10320645.html
Copyright © 2020-2023  润新知