Day 20面向对象基础介绍

Day 20

前言:

面向过程编程
核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
基于该思想写程序就是在设计一条条的流水线

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

面向对象编程
核心是对象二字,对象是一个用来盛放数据与功能的容器
基于该思想写程序就是在整合程序

优点:可扩展性强
缺点:编程的复杂度高

1 对象是单个事物的抽象

2 对象是一个容器,封装了属性和方法(数据或者功能的集合)

​ 在面向对象程序开发的思想中,每一个对象都是功能的中心,具有明确的分工,可以完成接受信息处理数据、发出信息等任务因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural programming),更适合多人合作的大型软件项目。

面向对象面向过程

  • 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
  • 面向对象就是找一个对象,指挥得结果
  • 面向对象将执行者转变成指挥者
  • 面向对象不是面向过程的替代,而是面向过程的封装

面向对象的特性:

  • 封装性
  • 继承性
  • [多态性]抽象

一、如何基于面向对象的思想编写程序

在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。
自定义的对象数据类型就是面向对象中的类( Class )的概念。

我们以字典来做个栗子

def student_info(student):  # 定义函数的方法
    print(f"""
    姓名:{student["name"]}
    年龄:{student["age"]}
    成绩:{student["score"]}
    """)


student1 = {'school':"外比巴卜", 'name': "张三", 'age': 18, 'score': 77, 'info': student_info}  # 字典接受信息
student2 = {'school':"外比巴卜"'name': "罗志祥", 'age': 38, 'score': 59, 'info': student_info}

student1['info'](student1)  #调用方法
student2['info'](student2)

我们发现其中有许多相同的数据对吧,比如说school还有 student_info这个方法,那我们可以找一个容器接收这两个数据吗?其实是有的python给我们定义了类( Class )的概念,下面尝试用类来将代码完善下!

class Student:  # 接受参数与方法
    school = "外比巴卜"

    def choose(self):
        print("正在选课!")

        
stu1 = Student()  # stu1是类的实例化对象拥有属性和方法
stu2 = Student()
stu3 = Student()

print(stu1.school) # 查看与类绑定的属性
stu1.choose() # 查看与类绑定的方法
--------------------------------
>>> 外比巴卜
	正在选课!

二、类和对象的关系

上面这个例子我们已经初步了解到了类与对象的关系,简单来说

  • 是模板,对象 是根据 这个模板创建出来的,应该先有类,再有对象
  • 只有一个,而 对象 可以有很多个
    • 不同的对象 之间 属性 可能会各不相同
    • 中定义了什么 属性和方法对象 中就有什么属性和方法

那么他们在内存中的顺序是什么样的呢?
在这里插入图片描述

上面的代码扩展性还是不够好对吧,如果我们要给对象添加更多的属性比如说,姓名,年龄,成绩等…我们需要不停地重复赋值

那么有没有简单地方法可以多次赋值呢?

"""stu1.name = "张三"
   stu2.name = "李四"
..........."""


def init(obj, name, age, score):  将赋值方法封装成函数就可以减少代码的冗余了
    obj.name = name
    obj.age = age
    obj.score = score
    
stu1 = Student()
init(stu1, "张三", 18, 87)
print(stu1.__dict__)  # 对象与类的本质实际上就是字典
--------------------------------
>>> {'name': '张三', 'age': 18, 'score': 87}

三、绑定方法

类中定义的函数是绑定给所有对象用的,绑定给谁就应该由哪个对象来调用对象.绑定方法()会把对象当作第一个参数传入类.函数()就是一个函数的玩法,没有自动传参的效果

那上面的init来举例现在我们将它写进类中

class Student:
    school = "外比巴卜"

    def init(obj, name, age, score):
        obj.name = name
        obj.age = age
        obj.score = score

    def choose(self):
        print("正在选课!", self)

stu1 = Student()
stu1.init("张三", 18, 87) 
stu1.choose()
print(stu1)
print(stu1.__dict__)
--------------------------------
>>> 正在选课! <__main__.Student object at 0x0000015BE1D0DC88>
	<__main__.Student object at 0x000001EDAAC2EC50>
	{'name': '张三', 'age': 18, 'score': 87}

四、初始化方法

在创建类时我们有一个为对象创建初始值的方法

这个初始化方法 就是 __init__ 方法,__init__ 是对象的内置方法,是专门用来定义一个类具有哪些属性的方法!该方法在创建对象时会被自动调用。

class Student:
    school = "外比巴卜"

    def __init__(self, name, age, score):
        obj.name = name
        obj.age = age
        obj.score = score

    def choose(self):
        print("正在选课!", self)
        
stu1 = Student("张三", 18, 87)  #实例化对象赋予属性
print(stu1.__dict__)
--------------------------------
>>>  {'name': '张三', 'age': 18, 'score': 87}  

作用与上面的 init方法是一样的,但是使用起来更方便,好处也更多。明天详解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值