【Python零基础】19天从零开始学Python——第十六天 面向对象

第十六天 面向对象

B站链接:https://www.bilibili.com/video/BV1gf4y1S7Y9

一、面向对象基础

1、目标:
  1、理解面向对象
  2、类和对象
  3、添加和获取对象属性
  4、魔法方法
2、好处:化简代码,代码、逻辑更简单
3、面向对象是一种,抽象化的编程思想,通过编程设置事物能够做什么事,事物直接使用,不用管内部的情况
4、面向对象就是将编程当成一个事物,编程是设置事物能够做什么事

二、类和对象

面向对象编程过程中,有两个重要组成部分:类和对象
举例:类,创建图纸;对象,洗衣机。最后,我们使用洗衣机洗衣服
二者关系:用类去创建对象,也可以表述为用类去实例化对象。
类概念
  类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物
  特征:即属性;行为:即方法
对象概念
对象是类创建出来的真实存在的事物
注意:
在开发中,先有类,再有对象

三、面向对象实现方法

定义方法

类名,命名大驼峰
class 类名()
  代码
  …

定义类

用类去创建对象,对象名(又叫实例)
对象名 = 类名()

代码

在类里将函数功能封装起来def,使用函数,需要创建对象,即实例化方法:对象名.类名()

# 洗衣机-洗衣
# 1、定义洗衣机类
class Washer():
    # 在类里将洗衣服的功能封装起来,功能--定义一个函数def
    def wash(self):
        print('可以洗衣服')
# 2、创建对象 对象名=类名()
haier = Washer()
# 3、验证成果
# 打印haier
print(haier)  # <__main__.Washer object at 0x000002323211A198>
# 使用wash功能--实例方法/对象方法--对象名.wash()
haier.wash()  # 可以洗衣服

类里面的self

self指的是调用该函数的对象,因为打印二者得到的内存地址一样
在这里插入图片描述

一个类可以创建多个对象

1、1个类可以创建多个对象
2、多个对象的self地址不相同

class Washer():
        def wash(self):
            print('可以洗衣服')
            print(self)
wash1 = Washer()
wash1.wash()  # <__main__.Washer object at 0x0000024B5AE7A198>
wash2 = Washer()
wash2.wash()  # <__main__.Washer object at 0x000001B70253A860>

三、添加或获取对象属性

类外面

'''
属性即特征
学习添加和获取属性
对象属性可以在类内/外(添加)和(获取)属性
'''
# 1、类外面添加对象属性
# 语法:对象名.属性名 = 值
class Washer():
    def wash(self):
        print('可以洗衣服')
# 创建对象,对象名=类名()
haier1 = Washer()
# 添加对象属性,对象名.属性名 = 值
haier1.width = 400
haier1.height = 500
# 2、在类外面获取对象属性,对象名.属性名
print(f'haier1洗衣机的宽度是{haier1.width}')
print(f'haier1洗衣机的高度是{haier1.height}')
# haier1洗衣机的宽度是400
# haier1洗衣机的高度是500

类里面

# 3、类里面获取对象属性
# 语法:self.属性名
class Washer():
    def wash(self):
        print('可以洗衣服')
    def print_info(self):
        # 4、在类里面获取实例属性
        print(f'haier1洗衣机的宽度是{self.width}')
        print(f'haier1洗衣机的高度是{self.height}')
# 创建对象,对象名=类名()
haier1 = Washer()

# 添加实例属性,对象名.属性名 = 值
haier1.width = 400
haier1.height = 700
# 对象调用实例方法
haier1.print_info()

四、魔法方法

1、魔法方法简介

__XX__()的函数叫做魔法方法,指的是具有特殊功能的函数

2、魔法方法分类

2.1__init__()

1、创建对象之前就有与生俱来的属性
__init__():初始化对象,添加实例属性
在创建一个对象的时候,默认被调用,不需要手动调用
self属性,解释器会自动把当前的对象引用传递过去

流程:
1、定义类
  --init魔法方法:width和height实例属性
  --添加实例方法:访问实例属性
2、创建对象
3、验证成果
  --调用实例方法

class Washer():
    def __init__(self):
        # 添加实例属性
        self.width = 50
        self.height = 800
    # 添加实例方法
    def print_info(self):
        print(f'洗衣机的宽度是{self.width}')
        print(f'洗衣机的高度是{self.height}')
# 创建对象
haier = Washer()
haier.print_info()
# 洗衣机的宽度是50
# 洗衣机的高度是800

2.2__init__(self)带参数

一个类可以创建多个对象,对不同的对象,设置不同的初始化属性

class Washer():
    def __init__(self,width,height):  # 带有两个形参
        self.width = width  # 实例属性
        self.height = height
    def washer(self):
        print(f'洗衣机的宽是{self.width}')  # 实例方法中调用实例属性
        print(f'洗衣机的高是{self.height}')

haier = Washer(10,20)  # 创建对象,输入真实数据
haier.washer()  # 调用实例方法
# 洗衣机的宽是10
# 洗衣机的高是20

2.3__str__

定义str,将会返回这个方法中return的数据(解释说明的文字),而不是返回该对象的默认地址
因为:当使用print输出对象的时候,默认打印对象的内存地址

class Washer():
    def __init__(self):
        self.width = 300
    def __str__(self):
        return '解释说明:类的说明或对象状态的说明'
haier = Washer()
print(haier)  # 解释说明:类的说明或对象状态的说明

2.4__del__

魔法方法__del__()
删除对象时,python解释器会默认调用__del__()方法

class Washer():
    def __init__(self):
        self.width = 300
    def __str__(self):
        return '123'
    def __del__(self):
        print('对象已经删除')

haier = Washer()
print(haier)
# 按顺序执行Waser里面的实例方法
# 123
# 对象已经删除

五、面向对象综合应用(案例)

烤地瓜
    1、需求
        被烤的时间和对应的地瓜状态
        添加调料
    2、分析步骤(明确需求的前提下)
        将涉及的事物进行分类——事物,地瓜;类,地瓜类
        2-1定义类
            地瓜的属性:(初始化属性)
                被烤的时间
                地瓜的状态
                添加的调料
            地瓜的方法:
                被烤
                添加调料
            显示对象信息__str__,用于输出对象状态,(这里是指时长多少,烤熟没)
        2-2创建对象,并调用对应的实例方法
    3、代码落地

案例一:烤地瓜

搬家具
    1、需求:将小于房子剩余面积的家具摆放到房子中
    2、分析步骤
        将涉及的事物进行分类——事物:房子和家具
                            ——类:房子类和家具类
                            再用类实例化对象
        2-1定义类
            2-1-1房子类
                (1)实例属性:
	                1)房子地理位置
	                2)房子占地位置
	                3)房子剩余位置
	                4)房子内家具列表)
                (2)实例方法:是否能容纳家具
                (3)显示房屋信息
            2-1-2家具类
                (1)实例属性
                    1)家具名称
                    2)家具占地位置
        2-2创建对象,并调用对应的实例方法
    3、代码落地   

1、定义类

初始化属性、被烤和添加调料(list存储)的方法,显示对象信息的str

1-1初始化属性
class SweetPotato():
    def __init__(self):
        self.cook_time = 0
        self.cook_state = '生的'
        self.condiments = []  # 用空列表存储
1-2烤地瓜的方法+显示对象信息

1、定义类的cook方法:计算烤过的时间,并通过if条件判断句和烤的状态相联系
2、使用魔法方法__str__()的return显示地瓜烤的时间以及烤的状态
3、使用self.cook_time += time ,可以计算总的烤的时间,若不熟,还可以接着烤。

    # 烤地瓜的方法
    def cook(self,time):
        # 1、计算整体地瓜烤过的时间
        self.cook_time += time
        # 2、用整体烤过的时间再判断地瓜的状态
        if 0 <= self.cook_time < 3:
            self.cook_state = '生的'
        elif 3 <= self.cook_time < 5:
            self.cook_state = '半生不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_state = '熟了'
        elif self.cook_time >= 8:
            self.cook_state = '烤糊了'
    def __str__(self):
        return f'这个地瓜的被烤过时间是{self.cook_time}分钟,状态是{self.cook_state}'
1-3加调料的方法+显示对象信息

放置在列表里,初始化时带有condiment,此形参可以接收顾客添加自己想要的真实数据(实参)

    def add_condiments(self,condiment):
        # 用户意愿的调料追加到调料列表
        self.condiments.append(condiment)
    def __str__(self):
        return  f'这个地瓜的被烤过时间是{self.cook_time}分钟,状态是{self.cook_state},调料有{self.condiments}'

2、创建对象并调用相应的实例方法

# 2、创建对象并调用相应的实例方法
# 初始状态
digua1 = SweetPotato()
print(digua1)  # 这个地瓜的被烤过时间是0分钟,状态是生的
# 传入真实参数--烤过的时间
digua1.cook(3)
digua1.add_condiments('辣椒面')
print(digua1)  # 这个地瓜的被烤过时间是3分钟,状态是半生不熟
digua1.cook(4)
digua1.add_condiments('酱油')
print(digua1)

3、运行结果

这个地瓜的被烤过时间是0分钟,状态是生的,调料有[]
这个地瓜的被烤过时间是3分钟,状态是半生不熟,调料有['辣椒面']
这个地瓜的被烤过时间是7分钟,状态是熟了,调料有['辣椒面', '酱油']

案例二:搬家具

1、定义类

1-1家具类
# 家具类
class Furniture():
    def __init__(self,name,area):
        # 家具名字
        self.name = name
        # 家具占地面积
        self.area = area
    # def __str__(self):
        # return f'家具是{self.name},占地是{self.area}平方米'

1-2房子类
# 房子类
# 1、实例属性
class Home():
    def __init__(self,address,area):
        # 地理位置
        self.address = address
        # 房屋面积
        self.area = area
        # 剩余面积
        self.free_area =area
        # 家具列表
        self.furniture = []
    def __str__(self):
        return f'房子的地理位置在{self.address},房屋面积是{self.area},剩余面积是{self.free_area},家具有{self.furniture}'
1-3实例方法(容纳家具)
# 2、实例方法
# 房屋内添加家具,创建item形参去接收家具
    def add_furniturn(self,item):
        # self.item += item
        if self.free_area >= item.area:
            # 家具列表添加家具名字!!
            self.furniture.append(item.name)
            # 家具搬入后,剩余面积
            self.free_area -= item.area
        else:
            print('家具太大,剩余面积不足,无法容纳')

2、创建对象并调用相应的实例方法

# 3、显示房屋信息

# 双人床,六平米
bed = Furniture('双人床',6)
# print(bed)
# 房子1:北京,1000
home1 = Home('北京',1000)
# 调用实例化方法
home1.add_furniturn(bed)
# 打印,显示
print(home1)  # 房子的地理位置在北京,房屋面积是1000,剩余面积是994,家具有['双人床']

3、运行结果

房子的地理位置在北京,房屋面积是1000,剩余面积是994,家具有['双人床']

六、面向对象重要组成部分总结

用类去创建对象,也可以表述为用类去实例化对象

1、类

- 创建类

class 类名():
  代码

2、对象

对象名.类名()

添加对象属性

  • 类外面

对象名.属性名 = 值

  • 类里面

self.属性名 = 值

获取对象属性

  • 类外面

对象名.属性名

  • 类里面

self.属性名

3、魔法方法

__init__()初始化
__str__()输出对象信息
__del__()删除对象时调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值