zoukankan      html  css  js  c++  java
  • 类初体验, 类的继承,类的组合,菱形继承,子类派生的新方法中重用父类的功能,抽象类多态多态性

    类初体验

    class OldboyStudent:
        school='oldboy'
    
    
        def __init__(self, x, y, z): #会在调用类时自动触发
            self.name = x #stu1.name='耗哥'
            self.age = y  #stu1.age=18
            self.sex = z #stu1.sex='male'
    
        def choose_course(self,x):
            print('%s is choosing course' %self.name)
    
        def func():
            pass
    # 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
    # 对象名称空间中定义的只有数据属性,而且时对象所独有的数据属性
    
    stu1=OldboyStudent('耗哥',18,'male')
    stu2=OldboyStudent('猪哥',17,'male')
    stu3=OldboyStudent('帅翔',19,'female')
    
    # print(stu1.name)
    # print(stu1.school)
    
    
    # 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
    # print(OldboyStudent.choose_course)
    # OldboyStudent.choose_course(123)
    
    # 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
    #绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
    # print(id(stu1.choose_course))
    # print(id(stu2.choose_course))
    # print(id(stu3.choose_course))
    # print(id(OldboyStudent.choose_course))
    
    # print(id(stu1.school))
    # print(id(stu2.school))
    # print(id(stu3.school))
    #
    # print(id(stu1.name),id(stu2.name),id(stu3.name))
    
    
    # stu1.choose_course(1)
    # stu2.choose_course(2)
    # stu3.choose_course(3)
    stu1.func()
    
    # 补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self
    类初体验

    类的继承

    1、什么是继承
        继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
        继承的特性是:子类会遗传父类的属性
        强调:继承是类与类之间的关系
    
    2、为什么用继承
        继承的好处就是可以减少代码的冗余
    
    3、如何用继承
        在python中支持一个类同时继承多个父类
        在python3中
            如果一个类没有继承任何类,那默认继承object类
        在python2中:
            如果一个类没有继承任何类,不会继承object类
    
        新式类
            但凡继承了object的类以及该类的子类,都是新式类
        经典类
            没有继承object的类以及该类的子类,都是经典类
    
        在python3中都是新式类,只有在python2中才区别新式类与经典类
    类的继承

    类的组合

    1、什么是组合
        组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象
    
    
    2、为何用组合
        组合也是用来解决类与类直接代码冗余问题的
    
    3、如何用组合
    
    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class OldboyStudent(OldboyPeople):
        def __init__(self,name,age,sex,stu_id):
            OldboyPeople.__init__(self,name,age,sex)
            self.stu_id=stu_id
    
        def choose_course(self):
            print('%s is choosing course' %self.name)
    
    class OldboyTeacher(OldboyPeople):
    
        def __init__(self, name, age, sex, level):
            OldboyPeople.__init__(self,name,age,sex)
            self.level=level
    
        def score(self,stu,num):
            stu.score=num
            print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num))
    
    
    stu1=OldboyStudent('猪哥',19,'male',1)
    tea1=OldboyTeacher('egon',18,'male',10)
    
    stu1.choose_course()
    tea1.score(stu1,100)
    print(stu1.__dict__)
    类的组合

    类的菱形继承,python2与python3的区别

    #coding:utf-8
    '''
    1、菱形继承
        当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承
    
    2、菱形继承的问题:
        python2区分经典类与新式类,如果子的继承是一个菱形继承,那么经典类与形式的区别为?
            经典类下查找属性:深度优先查找
            新式类下查找属性:广度优先查找
            在python3中全是新式类,没有继承object默认继承
    
    
    
    '''
    
    class G(object):
        def test(self):
            print('from G')
        pass
    
    class E(G):
        def test(self):
            print('from E')
        pass
    
    class B(E):
        def test(self):
            print('from B')
        pass
    
    class F(G):
        def test(self):
            print('from F')
        pass
    
    class C(F):
        def test(self):
            print('from C')
        pass
    
    class D(G):
        def test(self):
            print('from D')
        pass
    
    class A(B,C,D):
        def test(self):
            print('from A')
        # pass
    
    obj=A()
    print(A.mro())
    # obj.test() #A->B->E-C-F-D->G-object
    在python2 和在python3中去用,会有区别

    子类派生的新方法中重用父类的功能的2种方法

    # 在子派生的新方法中重用父类功能的两种方式
    # 方式一:与继承无关
    #指名道姓法,直接用:类名.函数名
    # class OldboyPeople:
    #     school = 'oldboy'
    #
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    # class OldboyStudent(OldboyPeople):
    #     def __init__(self,name,age,sex,stu_id):
    #         OldboyPeople.__init__(self,name,age,sex)
    #         self.stu_id=stu_id
    #
    #     def choose_course(self):
    #         print('%s is choosing course' %self.name)
    
    
    # 方式二:严格以来继承属性查找关系
    # super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
    # super().__init__(不用为self传值)
    # 注意:
    # super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()
    # class OldboyPeople:
    #     school = 'oldboy'
    #
    #     def __init__(self, name, age, sex):
    #         self.name = name
    #         self.age = age
    #         self.sex = sex
    #
    # class OldboyStudent(OldboyPeople):
    #     def __init__(self,name,age,sex,stu_id):
    #         # OldboyPeople.__init__(self,name,age,sex)
    #         super(OldboyStudent,self).__init__(name,age,sex)
    #         self.stu_id=stu_id
    #
    #     def choose_course(self):
    #         print('%s is choosing course' %self.name)
    #
    #
    # stu1=OldboyStudent('猪哥',19,'male',1)
    # print(stu1.__dict__)
    #
    # print(OldboyStudent.mro())
    2种方法

    抽象类,多态,多态性

    '''
    1 什么是多态
        多态指的是同一种事物的多种形态
            水-》冰、水蒸气、液态水
            动物-》人、狗、猪
    
    2 为和要用多态
        多态性:
        继承同一个类的多个子类中有相同的方法名
        那么子类产生的对象就可以不用考虑具体的类型而直接调用功能
    
    3 如何用
    '''
    import abc
    
    class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def speak(self):
            pass
        @abc.abstractmethod
        def eat(self):
            pass
    
    # Animal() #强调:父类是用来指定标准的,不能被实例化
    
    class People(Animal):
        def speak(self):
            print('say hello')
    
        def eat(self):
            pass
    
    class Dog(Animal):
        def speak(self):
            print('汪汪汪')
    
        def eat(self):
            pass
    class Pig(Animal):
        def speak(self):
            print('哼哼哼')
    
        def eat(self):
            pass
    
    
    
    peo1=People()
    dog1=Dog()
    pig1=Pig()
    #
    #
    # peo1.speak()
    # dog1.speak()
    # pig1.speak()
    # python推崇的是鸭子类型,只要你叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子
    抽象类,多态,多态性,鸭子类型
  • 相关阅读:
    iOS 6 Auto Layout NSLayoutConstraint 界面布局
    TexturePacker使用心得---1。
    今天说说敏捷个人-认识自我,管理自我 v0.2
    iPhone 5 屏幕尺寸变长指南
    JSON数据解析错误处理办法!
    IOS 入门介绍3iOS里面Frameworks介绍(续)
    Open GLSL ——01
    Open GLES 01
    IOS 入门介绍2iOS里面Frameworks介绍
    Opne GL ES 学习心得!
  • 原文地址:https://www.cnblogs.com/xiejintao0914/p/9253731.html
Copyright © 2011-2022 走看看