27---面向对象编程思想

一 面向过程与面向对象

  • 面向过程

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

二 面向对象---如何一步一步进行整合

  • 整合引入---化妆盒

    如果我们把”化妆“比喻为要执行的业务逻辑,此时只需要拿来一样东西即可,那就是彩妆盒,因为彩妆盒里整合了化妆所需的所有原材料与功能,这比起你分别拿来原材料与功能才能执行,要方便的多。
    
  • 程序 = 数据 + 功能
    • 1 未学函数之前读取信息
    # 所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。在学习”对象“之前,程序中的数据与功能是分离开的,如下
    
    name = ‘如花‘
    age = 18
    gender = ‘male‘
    print(f‘{name} {age} {gender}‘)
    
    • 2 学函数后---可以通过定义函数读取信息
    name = ‘如花‘
    age = 18
    gender = ‘male‘
    # 函数整合:读取信息
    def tell_info():
        print(f‘{name} {age} {gender}‘)
    # 修改信息
    def set(x,y,z):
        global name,age,gender
        name = x
        age = y
        gender = z
    
    • 3 可以将上述代码存入文件中,变成模块,但是每产生一个新的功能就创建一个新的文件并不方便管理。
    • 4 可以使用字典将数据和功能整合到一起
      name = ‘如花‘
      age = 18
      gender = ‘male‘
      # 函数整合:读取信息
      def tell_info(name,age,gender):
          print(f‘{name} {age} {gender}‘)
      # 修改信息
      def set(x,y,z):
          global name,age,gender
          name = x
          age = y
          gender = z
      # 数据和功能整合到字典中
      user_info = {
          ‘name‘:‘如花‘,
          ‘age‘:18,
          ‘gender‘:‘male‘,
          ‘tell_info‘:tell_info,
          ‘set‘:set
      }
      
    • 5 对4进行进一步修改,将功能函数需要的参数通过字典传值
      # 可以通过传字典的方式给函数内需要参数的地方传值
      # :读取信息
      def tell_info(user_info):
          name = user_info[‘name‘]
          age = user_info[‘age‘]
          gender = user_info[‘gender‘]
          print(f‘{name} {age} {gender}‘)
      # 修改信息
      def set(user_info,x,y,z):
          user_info[‘name‘] = x
          user_info[‘age‘] = y
          user_info[‘gender‘] = z
      
      user_info = {
          ‘name‘:‘如花‘,
          ‘age‘:18,
          ‘gender‘:‘male‘,
          ‘tell_info‘:tell_info,
          ‘set‘:set
      }
      
    • 6 以上五种方式,最后一种是对数据和功能整合度最高的方式,但是定义的功能和字典还是分开的,那么python到底提供了何种方式或语法允许我们将数据和功能很好的整合在一起呢?....

三 类与对象

类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。
  • 使用类的好处
可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。
如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器。
  • 注意
在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。
产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。

四 实现面向对象的编程

  • 先定义类

    # 类是对象相似数据与功能的集合体
    # 所以类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的
    # 注意:类体代码是在类定义阶段就会立即执行,会产生类的名称空间
    
    • 定义类
    # 类名采用驼峰体
    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(Student.__dict__)
    
    • 访问类的属性
    # 属性访问的语法
    # 1、访问数据属性
    print(Student.stu_school) # Student.__dict__[‘stu_school‘]
    # 2、访问函数属性
    print(Student.set_info) # Student.__dict__[‘set_info‘]
    # 3 增加类的属性
    Student.x=1111 #Student.__dict__[‘x]=111
    print(Student.__dict__)
    
  • 再调用类产生对象
    • 调用类产生对象
    stu1_obj=Student()
    stu2_obj=Student()
    stu3_obj=Student()
    
    print(stu1_obj.__dict__) #{}
    print(stu2_obj.__dict__) #{}
    print(stu3_obj.__dict__) #{}
    
  • 为对象定制独有的属性
    • 解决方案一
    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__)
    
    stu2_obj.stu_name=‘lili‘
    stu2_obj.stu_age=19
    stu2_obj.stu_gender=‘female‘
    # print(stu2_obj.__dict__)
    
    stu3_obj.stu_name=‘jack‘
    stu3_obj.stu_age=20
    stu3_obj.stu_gender=‘male‘
    # print(stu2_obj.__dict__)
    
    # 问题1:代码重复
    # 问题2:属性的查找顺序
    
    • 解决问题1--方案一
    # 解决方案一:定义函数将重复的代码封装成函数
    def init(obj,x,y,z):
        obj.stu_name=x
        obj.stu_age=y
        obj.stu_gender=z
    
    init(stu1_obj,‘egon‘,18,‘male‘)
    init(stu2_obj,‘lili‘,19,‘female‘)
    init(stu2_obj,‘jack‘,20,‘male‘)
    
    方案一的问题:功能没有整合
    
    • 解决问题1---方案二
    将函数放在类体代码中,函数名规定为__init__
    
    # 总结__init__方法
    # 1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
    # 2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在
    #    类调用时就立刻执行的代码都可以放到该方法内
    # 3、__init__方法必须返回None
    
    # 一:先定义类
    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
    
    # 二:再调用类产生对象
    # 调用类的过程又称之为实例化,发生了三件事
    # 1、先产生一个空对象
    # 2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
    # 3、返回初始完的对象
    
    stu1_obj=Student(‘egon‘,18,‘male‘) # Student.__init__(空对象,‘egon‘,18,‘male‘)
    stu2_obj=Student(‘lili‘,19,‘female‘)
    stu3_obj=Student(‘jack‘,20,‘male‘)
    
    print(stu1_obj.__dict__)
    print(stu2_obj.__dict__)
    print(stu3_obj.__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‘)

print(stu1_obj.count) # 3
print(stu2_obj.count) # 3
print(stu3_obj.count) # 3
  • 类中存放的是对象共有的数据和功能
  • 类访问属性
# 1、类的数据属性
print(Student.stu_school)
# 2、类的函数属性
print(Student.tell_stu_info)
print(Student.set_info)
  • 类中存放的属性是给对象使用的
  • 类的【数据属性】是给所有对象共享的,所以内存地址是相同的
print(id(Student.stu_school))

print(id(stu1_obj.stu_school))
print(id(stu2_obj.stu_school))
print(id(stu3_obj.stu_school))

# 更改了类中的数据属性:即所有对象共有的属性值被改变了
Student.stu_school=‘OLDBOY‘
# 只更改了stu1_obj对象的数据属性,对其他对象没有影响
stu1_obj.stu_school=‘OLDBOY‘
  • 类的【函数属性】主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同

    • 类调用自己的函数属性必须严格按照函数的用法
    # 类调用自己的函数属性必须严格按照函数的用法来
    print(Student.tell_stu_info)
    print(Student.set_info)
    
    # tell_stu_info需要几个参数就必须传入几个参数
    Student.tell_stu_info(stu1_obj)
    Student.tell_stu_info(stu2_obj)
    Student.tell_stu_info(stu3_obj)
    # set_info需要几个参数就必须传入几个参数
    Student.set_info(stu1_obj,‘EGON‘,19,‘MALE‘)
    Student.tell_stu_info(stu1_obj)
    
    • 对象使用【函数属性】--绑定方法的特殊之处在于:谁来调用绑定方法就会将谁当做第一个参数自动传入
    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)
    
    # 对象使用选课函数属性
    stu1_obj.choose(‘python全栈开发‘)
    print(stu1_obj.course)
    
    stu2_obj.choose(‘linux运维‘)
    print(stu2_obj.course)
    
    stu3_obj.choose(‘高级架构师‘)
    print(stu3_obj.course)
    

六 属性查找举例----列表

l1=[‘aa‘,‘bb‘,‘cc‘] # l=list([1,2,3])
l2=[111,222,333] # l=list([1,2,3])
print(l1.append)
print(list.append)
# 对象访问函数属性
l1.append(‘dd‘)
l2.append(‘dd‘)
print(l1)
print(l2)
# 类访问函属性
list.append(l1,‘dd‘)
list.append(l2,‘dd‘)
print(l1)
print(l2)

原文地址:https://www.cnblogs.com/Kathrine/p/12656350.html

时间: 2024-11-12 15:36:53

27---面向对象编程思想的相关文章

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想的哲学起源(转载)

http://www.xuebuyuan.com/566309.html 本来想象着写一整篇「面向对象编程思想的哲学起源」这样的题目,笔走纸上,方才发现这样的题目足够出本书,知识不够,写不动.但心里还是想写点自己的所思所想. 全篇就拿JAVA来举例了.众所周知,面向对象的四大基本要素:抽象(Abstract).封装(Encapsulation).继承(Inheritance).多态(Polymorphism). 很多人坚持<逻辑学>是唯物哲学的基础,不懂,姑且不论.哲学就是对自然学科的抽象,看

面向对象编程思想(OOP)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想(前传)--你必须知道的javascript(转载)

原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 call apply band js中的闭包 什么是高阶函数 在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 javascript是一门典型的动态类型语

面向对象编程思想 - 月亮晶石的日志 - 网易博客

面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计. 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统).这可以使系统直接地映射问题域,保

[Javascript] 面向对象编程思想

1.创建对象 1.1 new 用new进行创建对象: var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = 'ajun'; 1.2{} 用{}创建对象,如: var user = { 'name':'ajun, 'age':12 } 这里同时候为user添加了两个属性分别为:name,age 在以上代码稍加改造,你还可以为一个对象添加一个方法,如: var user = { 'name':'ajun', 'age':12 '

第三章面向对象编程思想

""" 编码规范: 类名首字母应以大写字母开头 类的成员/属性: 成员属性 实例化对象的属性: self.name=name 可以被访问,也可以在类的外部被修改 私有属性 实例化对象的私有属性: self.__age=age 属性名前加两下划线 外部无法被访问, 也不能被修改,只能内部访问和修改 想要在外部访问只能自定义一个方法了 强制访问 私有属性: p._People__age 对象名._类名__私有属性 公共属性: 类的属性,也叫静态属性,他是在类的内部定义的 clas

面向对象编程思想(OOP)(转发)

本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞大 很多软件进入维护阶段 需求的不断变更 软件开发中存在很多其他的问题,上面只是从程序开发和设计的角度看到的部分问题.需求解决上面软件开发中的问题,就要求我们编写(设计)的软件具有很好的可读性.可维护性和可扩展性.我们需要保证代码具有高内聚低耦合. 下面将简单介绍面向对象的一些基本特性.设计原则,以

面向对象编程思想2s

面向对象编程思想 抽象 封装和数据隐藏 多态 继承 代码的可复用性 面向对象分析 五个层次.五个活动组成 目的 1.获得系统的对象个体.个体内部的状态.个体与个体间的交互 活动 1.建模系统功能 2.发现并且确定业务对象 3.组织对象并确定其关系 抽象 舍弃个别的.非本质的特征,抽取共同的.本质的特征 ss 原文地址:https://www.cnblogs.com/cnblogzaizai/p/12028791.html

从一些简单代码实例彻底理解面向对象编程思想|OOP本质是什么?

从Rob Pike 的 Google+上的一个推看到了一篇叫<Understanding Object Oriented Programming>的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评论. 先看这篇教程是怎么来讲述OOP的.它先给了下面这个问题,这个问题需要输出一段关于操作系统的文字:假设Unix很不错,Windows很差. 这个把下面这段代码描述成是Hacker Solution.(这帮人觉得下面这叫黑客?我估计这帮人真是没看过C语言的代码) 1 2 3 4