• Python3 day6面向对象


    http://www.cnblogs.com/alex3714/articles/5188179.html

    ====================生活中====================

    世界万物,皆可分类

    世界万物,皆为对象

    只要是对象:肯定属于某种品类

    只要是对象:肯定有属性

    ================================================

    大纲:

    面向对象:特性

    核心:Class:类

       Object:对象

    特性:继承:Inheritance :便于程序的扩展,同时减少大量冗余代码

          封装:Encapsulation:隐藏实现细节

          多态性:polymorphism :一个接口多个实现,在继承、派生时候

     继承特性

    类的 封装 

    构造函数:向类的方法传值使用。

    格式:def __init__(self,变量名1,变量名2,变量名3....):

          self.内部变量名a = 变量名1  

          self.内部变量名b = 变量名2

          self.内部变量名c = 变量名3                        

    析构函数:双下划线开始和结束,在被实例化的实例被删除的时候自动执行:如本例的__del__()

    私有类变量当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:self.__life_value = life_value

    私有方法:当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:def __selffunc(self):

    类的重构:对父类构造函数重构用于:子类中需加入新的参数时使用【本例子类Man中比父类多了money实例变量】

    继承多类

     经典类和新式儿类的区别:主要体现在多类的继承

    类的继承搜索方式(策略):

          一:广度优先:Python3默认(不区分经典类和新式类)

          二:深度优先:Python 2里面经典类使用的继承方式,新式类使用广度优先继承方式

    本图:广度优先:当子类D实例化时,优先在B或者C找 构造函数__init__(self,变量名...)找不到再想上A那里找。

      

    类的继承应用:学校,学校成员(教师、学生)

    一个学校类

    学校成员类

       教师子类、学生子类

    目标:学校类功能:学校名字、地址、招聘教师,收学生

        成员类功能:都有名字、年龄、性别等成员共同属性。

        教师子类:继承成员类功能,增加教学功能、工资、所教课程种类、

        学生子类:继承成员类功能,增加学习功能、班级、所学课程种类、

      实例化多个学生和老师,学校进行招聘,和开课。学校里面的信息更新,和查看。

    class School(object):
        '''学校共有属性'''
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
            self.students = []
            self.staffs = []
        def enroll(self,stu_obj):
            print('为学员:%s 办理注册手续'% stu_obj.name)
            self.students.append(stu_obj)
        def hire(self,staff_obj):
            print('hire teacher :%s'% staff_obj.name)
            self.staffs.append(staff_obj)
    class School_Member(object):
        '''成员共有属性'''
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
        def tell(self):
            pass
    class Teacher(School_Member):
        '''老师独有属性'''
        def __init__(self,name,age,sex,salary,coures):
            super(Teacher,self).__init__(name,age,sex)
            self.salary = salary
            self.coures = coures
        def tell(self):
            print("""
            ==========info Teacher:%s =========
            name:%s
            age:%d
            sex:%s
            salary:%d
            coures:%s
            """%(self.name,self.name,self.age,self.sex,self.salary,self.coures))
    class Student(School_Member):
        '''学生独有属性'''
        def __init__(self,name,age,sex,stu_id,grade):
            super(Student,self).__init__(name,age,sex)
            self.stu_id = stu_id
            self.grade = grade
        def tell(self):
            print("""
            ==========info Student:%s =========
            name:%s
            age:%d
            sex:%s
            stu_id:%s
            grade:%s
            """%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
    t1 = Teacher('zhangmingda',22,'Man',15000,'python')
    t2 = Teacher('zhangmingda2',23,'Man',18000,'Linux')
    s1 = Student('qjj',24,'Girl',10001,'python')
    s2 = Student('qjj2',25,'Girl',10002,'Linux')
    school1 = School('隆化职中','下洼子')
    school1.enroll(s1)
    school1.enroll(s2)
    school1.hire(t1)
    school1.hire(t2)
    school1.students[0].tell()
    school1.students[1].tell()
    school1.staffs[0].tell()
    见代码

    多态特性:一个接口多种实现

    class Animal(object):
        def __init__(self,name):
            self.name = name
        def talk(self):
            '''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物'''
            raise NotImplementedError("Subclass must implement abstract method")
    
    class Make_dog(Animal):
        def talk(self):
            print('%s talking: 汪汪汪.....'% self.name)
    class Make_cat(Animal):
        def talk(self):
            print('%s talking: 喵喵喵.....' % self.name)
    def please_talk(obj):
        obj.talk()
    d1 = Make_dog('李亮')
    c1 = Make_cat('赵新新')
    please_talk(d1)
    please_talk(c1)
    View Code
    李亮 talking: 汪汪汪.....
    赵新新 talking: 喵喵喵.....

     在父类中实现一个接口多种实现(正常多态)

    class Animal(object):
        def __init__(self,name):
            self.name = name
        def talk(self):
            '''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物'''
            raise NotImplementedError("Subclass must implement abstract method")
        @staticmethod
        def animal_talk(obj):
            '''在父类通过统一的接口,实现不同子类的统一功能调用,增强代码复用'''
            obj.talk()
    
    class Make_dog(Animal):
        def talk(self):
            print('%s talking: 汪汪汪.....'% self.name)
    class Make_cat(Animal):
        def talk(self):
            print('%s talking: 喵喵喵.....' % self.name)
    
    d1 = Make_dog('李亮')
    c1 = Make_cat('赵新新')
    Animal.animal_talk(d1)
    Animal.animal_talk(c1)
    View Code
    李亮 talking: 汪汪汪.....
    赵新新 talking: 喵喵喵.....
    

      

  • 相关阅读:
    洛谷P5281 [ZJOI2019] Minimax搜索
    势函数
    Comet OJ [Contest #5] 迫真大游戏
    洛谷P3307 [SDOI2013] 项链
    洛谷P5985 [PA2019] Muzyka pop
    CF1205E Expected Value Again
    review
    CF891E Lust
    线性代数
    洛谷P4607 [SDOI2018] 反回文串
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/9145063.html
Copyright © 2020-2023  润新知