• python学习第24天面向对象之定义、基本操作、init方法详解、绑定方法


    面向过程编程与面向对象编程对比:

    (1)面向过程编程:
           核心是过程二字,过程指的是解决问题的步骤,即想干什么再干什么后干什么。。。
           基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式

    优点:
           复杂的问题流程化、进而简单化
    缺点:
            可扩展性差

    (2)面向对象编程:
    核心是对象二字,对象是特征与技能的结合体

    面向对象编程:我们关注的点是.使用什么样的对象可以完成我的任务

    优势: 1.对于指挥者(程序员)来说,不需要再关心具体步骤
              2.扩展性,一个单独的个体的特征或行为发生变化时 不会影响到别人

    缺点: 1.程序的复杂度变高,你得需要设计这个些对象,注意要避免过度设计得问题
              2.程序得执行结果可控性低

    一、定义

    (1)什么是对象、类

    对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
    站在不同的角度,总结出的类是截然不同的

    (2)为什么用对象、类

    在现实世界中一定是先有的一个个具体存在的对象,然后随着人类文明地发展而总结出了不同的类
    在程序中务必保证先定义类,后调用类来产生对象

    (3)对象、类产生过程

    现实世界中总结对象-----》抽取相似之处,得到现实世界中的类---》定义为程序中的类-----》调用类,产生程序中的对象

    站在老男孩选课系统的角度:
            现实世界中的老男孩学生对象:
                    对象1:
                        特征:
                            学校='oldboy'
                            姓名='耗哥'
                            年龄=18
                            性别='male'
                        技能:
                            选课
         
    站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类
                    老男孩学生类:
                        相似的特征:
                            学校='oldboy'
                        相似的技能
                            选课

    二、基本操作

    #1、先定义类

    class OldboyStudent:                    #驼峰体
    school='oldboy'

    def choose_course(self):
    print('is choosing course')

    # 在定义阶段
    # 只要包含该类的py被执行 就会做两件事情
    # 1.就会创建类的名称空间
    # 2.执行代码 将产生的名称放入名称空间

    # print(OldboyStudent.__dict__)
    # 类本质就是一个名称空间/容器,从类的名称空间中增/删/改/查名字
    # python为我们提供专门访问属性(名称空间中的名字)的语法,点后的都是属性
    OldboyStudent.school #OldboyStudent.__dict__['school']
    OldboyStudent.x=1 #OldboyStudent.__dict__['x']=1
    OldboyStudent.school='Oldboy' #OldboyStudent.__dict__['school']='Oldboy'
    del OldboyStudent.x #del OldboyStudent.__dict__['x']

    # 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
    # OldboyStudent.choose_course(123)

    #2、后调用类产生对象,调用类的过程称之为实例化,实例化的结果称为类的一个实例或者对象
    stu1=OldboyStudent()                # print(stu1)
    stu2=OldboyStudent()                # print(stu1)
    stu3=OldboyStudent()                # print(stu3)

    对象本质也就是一个名称空间而已,对象名称空间是用存放对象自己独有的名字/属性,而类中存放的是对象们共有的属性

    三、绑定方法__init__

    1、定义

    绑定方法是什么?
    # 是对象与类中的某个函数的绑定关系像生活中 我们都会吃饭 我吃饭你不会饱那么吃饭就是我自己的绑定方法

    2、为什么要绑定 因为对象的行为 通常都需要访问这个对象的数据 或是修改这个对象的数据 如果没有对象

    直接调用函数是没有意义的 在函数中访问不到对象的数据 所以将对象和函数进行绑定

    3特殊之处
    # 在使用绑定方法时 不需要关心self参数 会自动将这个对象本身传进来 
    # 对象调用绑定方法时 最后执行的还是类中的那个函数

     
    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(self):
            pass

     

    __init__方法详解

     class OldboyStudent:
    #     school='oldboy'
    #
    #
    #     def __init__(obj, x, y, z): #会在调用类时自动触发
    #         obj.name = x #stu1.name='耗哥'
    #         obj.age = y  #stu1.age=18
    #         obj.sex = z #stu1.sex='male'
    #
    #     def choose_course(self):
    #         print('is choosing course')

    1、调用类时发生两件事
    #1、创造一个空对象stu1
    #2、自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入

    # stu1=OldboyStudent('耗哥',18,'male') #OldboyStudent.__init__(stu1,'耗哥',18,'male')
    # stu2=OldboyStudent('猪哥',17,'male')
    # stu3=OldboyStudent('帅翔',19,'female')

    __init__本质是个功能函数

    2、属性查找

    先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错

    1# 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
    # 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性

    2# 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
    # print(OldboyStudent.choose_course)
    # OldboyStudent.choose_course(123)

    3# 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
    #绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
    # print(id(stu1.choose_course))
    # print(id(stu2.choose_course))
    # print(id(stu3.choose_course))
    # print(id(OldboyStudent.choose_course))

    PS:

    补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self

  • 相关阅读:
    使用日历控件的一些体会(downmoon)
    带附加条件的NewID()用法
    微软的招聘哲学——做微软人的五大核心素质(摘自《微软360度》)
    彻底禁用fckEditor的上传功能(含防止Type漏洞问题)
    Remote Access Connection Manager 服务因下列错误而停止解决办法
    GridView如何更新批量数据和单条记录?
    .net1.1与.net2.0在加载ascx文件的控件时有所不同(Downmoon)
    牛羊吃草问题求解(downmoon)
    c#操作ecxel的一些资源(downmoon搜集)
    安装sql2008 enterprise (English正式版)图解
  • 原文地址:https://www.cnblogs.com/ye-hui/p/9830298.html
Copyright © 2020-2023  润新知