zoukankan      html  css  js  c++  java
  • 4.7课堂

    面向对象编程

     

    一、引出

    面向过程:
        核心是"过程"二字
        
        过程的终极奥义就是将程序流程化
        过程是"流水线",用来分步骤解决问题的
        
    面向对象:
        核心是"对象"二字
        对象的终极奥义就是将程序"整合"
        对象是"容器",用来盛放数据与功能的
        
        类也是"容器",该容器用来存放同类对象共有的数据与功能
    

    二、列子

    # 学生的数据
    stu_name='egon'
    stu_age=18
    stu_gender='male'
    
    
    # 学生的功能
    def tell_stu_info(stu_obj):
        print('学生信息:名字:%s 年龄:%s 性别:%s' %(
            stu_obj['stu_name'],
            stu_obj['stu_age'],
            stu_obj['stu_gender']
        ))
    
    def set_info(stu_obj,x,y,z):
        stu_obj['stu_name']=x
        stu_obj['stu_age']=y
        stu_obj['stu_gender']=z
        
        
    # 课程的数据
    course_name='python'
    course_period='6mons'
    course_score=10
    
    # 课程的功能
    def tell_coure_info():
        print('课程信息:名字:%s 周期:%s 学分:%s' %(course_name,course_period,course_score))
    
    

    三、实现面向对象编程

    1.先定义类

    类是对象相似数据与功能的集合体
    # 所以类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的
    # 注意:类体代码是在类定义阶段就会立即执行,会产生类的名称空间
    
    class Student:
        # 1、变量的定义
        stu_school='oldboy'
    
        # 2、功能的定义
        def tell_stu_info(stu_obj):
            print('学生信息:名字:%s 年龄:%s 性别:%s' %(
                stu_obj['stu_name'],
                stu_obj['stu_age'],
                stu_obj['stu_gender']
            ))
    
        def set_info(stu_obj,x,y,z):
            stu_obj['stu_name']=x
            stu_obj['stu_age']=y
            stu_obj['stu_gender']=z
    
        # print('========>')
    
    print(Student.__dict__)
    
    {'__module__': '__main__', 'stu_school': 'oldboy', 'tell_stu_info': <function Student.tell_stu_info at 0x00000000026DC3A0>, 'set_info': <function Student.set_info at 0x00000000026DC280>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
    

    属性访问的语法

    # 1、访问数据属性
    print(Student.stu_school) # Student.__dict__['stu_school']
    # 2、访问函数属性
    print(Student.set_info) # Student.__dict__['set_info']
    
    Student.x=1111 #Student.__dict__['x]=111
    print(Student.__dict__)
    

    2.再调用类产生对象

    stu1_obj=Student()
    stu2_obj=Student()
    stu3_obj=Student()
    
    print(stu1_obj.__dict__)
    # print(stu2_obj.__dict__)
    # print(stu3_obj.__dict__)
    {}
    

    为对象定制自己独有的属性

    # 问题1:代码重复
    # 问题2:属性的查找顺序
    stu1_obj.stu_name='egon'   # stu1_obj.__dict__['stu_name']='egon'
    stu1_obj.stu_age=18        # stu1_obj.__dict__['stu_age']=18
    stu1_obj.stu_gender='male' #  stu1_obj.__dict__['stu_gender']='male'
    print(stu1_obj.__dict__)
    
    {'stu_name': 'egon', 'stu_age': 18, 'stu_gender': 'male'}
    

    解决方法

    class Student:
        # 1、变量的定义
        stu_school='oldboy'
    
        # 空对象,'egon',18,'male'
        def __init__(obj,x,y,z):
            obj.stu_name=x # 空对象.stu_name='egon'
            obj.stu_age=y  # 空对象.stu_age=18
            obj.stu_gender=z # 空对象.stu_gender='male'
            # return None
    
        # 2、功能的定义
        def tell_stu_info(stu_obj):
            print('学生信息:名字:%s 年龄:%s 性别:%s' %(
                stu_obj['stu_name'],
                stu_obj['stu_age'],
                stu_obj['stu_gender']
            ))
    
        def set_info(stu_obj,x,y,z):
            stu_obj['stu_name']=x
            stu_obj['stu_age']=y
            stu_obj['stu_gender']=z
            
    stu1_obj=Student('egon',18,'male') # Student.__init__(空对象,'egon',18,'male')        
    print(stu1_obj.__dict__)       
    {'stu_name': 'egon', 'stu_age': 18, 'stu_gender': 'male'}
    
    再调用类产生对象
    # 调用类的过程又称之为实例化,发生了三件事
    # 1、先产生一个空对象
    # 2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
    # 3、返回初始完的对象
    

    总结__init__方法

    # 1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
    # 2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在
    #    类调用时就立刻执行的代码都可以放到该方法内
    # 3、__init__方法必须返回None
    

    四、属性查找

    对象的名称空间里只存放着对象独有的属性,而对象们相似的属性是存放于类中的。对象在访问属性时,会优先从对象本身的__dict__中查找,未找到,则去类的__dict__中查找

    class Student:
        # 1、变量的定义
        stu_school='oldboy'
        count=0
    
        # 空对象,'egon',18,'male'
        def __init__(self,x,y,z):
            Student.count += 1
    
            self.stu_name=x # 空对象.stu_name='egon'
            self.stu_age=y  # 空对象.stu_age=18
            self.stu_gender=z # 空对象.stu_gender='male'
            # return None
    
        # 2、功能的定义
        def tell_stu_info(self):
            print('学生信息:名字:%s 年龄:%s 性别:%s' %(
                self.stu_name,
                self.stu_age,
                self.stu_gender
            ))
    
        def set_info(self,x,y,z):
            self.stu_name=x
            self.stu_age=y
            self.stu_gender=z
    
        def choose(self,x):
            print('正在选课')
            self.course=x
    
    stu1_obj=Student('egon',18,'male') # Student.__init__(空对象,'egon',18,'male')
    stu2_obj=Student('lili',19,'female')
    stu3_obj=Student('jack',20,'male')
    

    类中存放的是对象共有的数据与功能

    # 一:类可以访问:
    # 1、类的数据属性
    print(Student.stu_school)
    # 2、类的函数属性
    print(Student.tell_stu_info)
    print(Student.set_info)
    oldboy
    <function Student.tell_stu_info at 0x00000000026DC430>
    <function Student.set_info at 0x00000000026DC550>
    
    
    # 二:但其实类中的东西是给对象用的
    # 1、类的数据属性是共享给所有对象用的,大家访问的地址都一样
    print(id(Student.stu_school))
    
    print(id(stu1_obj.stu_school))
    print(id(stu2_obj.stu_school))
    print(id(stu3_obj.stu_school))
    33816112
    33816112
    33816112
    
     2、类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同
    
    # 类调用自己的函数属性必须严格按照函数的用法来
    
    print(Student.tell_stu_info)
    print(Student.set_info)
    
    Student.tell_stu_info(stu1_obj)
    Student.tell_stu_info(stu2_obj)
    Student.tell_stu_info(stu3_obj)
    
    Student.set_info(stu1_obj,'EGON',19,'MALE')
    Student.tell_stu_info(stu1_obj)
    <function Student.tell_stu_info at 0x00000000026BC280>
    <function Student.set_info at 0x00000000026BC430>
    学生信息:名字:egon 年龄:18 性别:male
    学生信息:名字:lili 年龄:19 性别:female
    学生信息:名字:jack 年龄:20 性别:male
    学生信息:名字:EGON 年龄:19 性别:MALE
    
    # 绑定方法的特殊之处在于:谁来调用绑定方法就会将谁当做第一个参数自动传入
    # print(Student.tell_stu_info)
    # print(stu1_obj.tell_stu_info)
    # print(stu2_obj.tell_stu_info)
    # print(stu3_obj.tell_stu_info)
    
    # stu1_obj.tell_stu_info() #tell_stu_info(stu1_obj)
    # stu2_obj.tell_stu_info() #tell_stu_info(stu2_obj)
    # stu3_obj.tell_stu_info() #tell_stu_info(stu3_obj)
    
    
    l1=['aa','bb','cc'] # l=list([1,2,3])
    # l1.append('dd')
    # list.append(l1,'dd')
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/haliluyafeng/p/12656990.html
Copyright © 2011-2022 走看看