python练习|面向对象

一、理解面向对象

面向对象是一种抽象化的编程思想很多编程语言中都有的一种思想。

面向对象是将编程当成是一个事物对外界来说事物是直接使用的不用去管他内部的情况。而编程就是设置事物能够做什么事。

二、类+对象

思考洗衣机洗衣服描述过程中洗衣机其实就是一个事物即对象洗衣机对象哪来的呢
答洗衣机是由工厂工人制作出来
思考工厂工人怎么制作出的洗衣机
答工人根据设计师设计的功能图纸制作洗衣机
总结图纸→洗衣机→洗衣服

在面向对象编程过程中有2个重要组成部分类+对象
类和对象的关系用类去创建一个对象

2.1 理解类和对象

2.1.1 类

类是对一系列具有相同特征和行为的事物的统称是一个抽象的概念不是真实存在的事物。

  • 特征即是属性

  • 行为即是方法

类比如是制造洗衣机时要用到的图纸也就是说类是用来创建对象。

2.1.2 对象

对象是类创建出来的真实存在的事物例如洗衣机。

注意开发中先有类后有对象。

2.2 面向对象实现方法

2.2.1 定义类

Python2中类分为 经典类+新式类

  • 语法
class 类名
    代码
    ......

注意类名要满足标识符命名规则同时遵循大驼峰命名习惯

2.2.2 创建对象

对象又名 实例。

  • 语法
对象名 = 类名
  • 体验
# 需求洗衣机 功能能洗衣服
# 1. 定义洗衣机类
"""
class 类名
    代码
"""


class Washer():
    def wash(self):
        print('能洗衣服')


# 2. 创建对象
# 对象名 =  类名
haier = Washer()

# 3. 成果
# 打印haier对象
print(haier)

# 使用wash功能 -- 实例方法/对象方法 -- 对象名.Wash()
haier.wash()

2.2.3 self

self 指的是调用该函数的对象。

# 类洗衣机  功能洗衣服
class Washer():
    def wash(self):
        print('洗衣服')
        print(self)

haier = Washer()
print(haier)

haier.wash()

# 总结由于打印对象和打印self得到的内存地址相同所以self指的是调用该函数的对象

体验

# 1. 一个类可以创建多个对象
# 2. 多个对象都调用函数的时候self地址是否相同  --- 不相同

class Washer():
    def wash(self):
        print('洗衣服')
        print(self)


haier1 = Washer()  # <__main__.Washer object at 0x000001E010E48E10>
haier1.wash()

haier2 = Washer()
haier2.wash()

三、添加和获取对象属性

属性即是特征比如洗衣机的宽度、高度、重量…
对象属性既可以在类外面添加和获取也能在类里面添加和获取。

3.1 类外面添加对象属性

  • 语法
对象名.属性名 =
  • 体验
class Washer():
    def wash(self):
        print('洗衣服')


haier1 = Washer()

# 添加对象属性   对象名.属性名 = 值
haier1.width = 400
haier1.height = 500

3.2 类外面获取对象属性

语法

对象名.属性名

体验

class Washer():
    def wash(self):
        print('洗衣服')


haier1 = Washer()

# 添加对象属性   对象名.属性名 = 值
haier1.width = 400
haier1.height = 500

# 获取对象属性---语法 对象名.属性名
print(f'洗衣机的宽度是{haier1.width}')
print(f'洗衣机的高度是{haier1.height}')

3.3 类里面获取对象属性

语法

self.属性名

体验

class Washer():
    def wash(self):
        print('洗衣服')
     # 获取对象属性
    def print_info(self):
         # self.属性名
         # print(self.width)
         print(f'洗衣机的宽度是{self.width}')
         print(f'洗衣机的高度是{self.height}')

haier1 = Washer()

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

四、魔法方法

在Python中__xx__()的函数叫做魔法方法指的是具有特殊功能的函数。

4.1 __init__()

4.1.1 体验 __init__()

思考洗衣机的宽度高度是与生俱来的属性可不可以再生产过程中就赋予这些属性呢
答理应如此
__init__()方法的作用初始化对象

注意

  1. __init__() 方法在创建一个对象时默认被调用不需要手动调用
  2. __init__(self) 中的self参数不需要开发者传递python解释器会自动把当前的对象引用传递过去。
  3. __init__() 此语法中每部分各2个下划线

体验

# 目标定义init魔法方法设置初始化属性并访问调用
"""
1.定义类
   init魔法方法width 和 height
   添加实例方法访问实例属性
2.创建对象
3.验证成果
   调用实例方法
"""

class Washer():
    def __init__(self):
        # 添加实例属性
        self.width = 500
        self.height = 800
    def print_info(self):
         print(f'洗衣机的宽度是{self.width}')
         print(f'洗衣机的高度是{self.height}')

haier = Washer()
haier.print_info()

4.1.2 带参数的 __init__()

思考一个类可以创建多个对象如何对不同的对象设置不同的初始化属性呢
答传参数

# 1. 定义类带参数的init宽度和高度     实例方法:调用实例属性
class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def print_info(self):
        print(f'洗衣机的宽度是{self.width},洗衣机的高度是{self.height}')

# 2. 创建对象创建多个对象且保证属性值不同调用实例方法
haier1 = Washer(10, 20)
haier1.print_info()

haier2 = Washer(100, 200)
haier2.print_info()

4.2 str()

当使用print输出对象的时候默认打印对象的内存地址。如果定义了__str__方法那么就会打印从在这个方法中return的数据。

class Washer():
    def __init__(self):
        self.width = 300

    def __str__(self):
        return '解释说明类的说明或对象状态的说明'

haier = Washer()
print(haier)

4.3 del()

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

class Washer():
    def __init__(self):
        self.width = 300

    def __del__(self):
        print('对象已经删除')

haier = Washer()

五、综合应用

5.1 烤地瓜

5.1.1 需求

需求主线
1.被烤的时间和对应的地瓜状态
0-3分钟 生的
3-5分钟 半生不熟的
5-8分钟 熟的
超过8分钟 烤糊了

2.添加的调料
用户可以按自己的意愿添加调料

5.1.2 步骤分析

需求涉及一个事物地瓜
因此案例涉及一个类地瓜类

5.1.2.1 定义类

  1. 地瓜的属性
    被烤的时间
    地瓜的状态
    添加的调料
  2. 地瓜的方法
    被烤
    用户根据意愿设定每次烤地瓜的时间
    判断地瓜被烤的总时间是在哪个区间修改地瓜的状态
    添加调料
    用户根据意愿设定添加的调料
    将用户添加的调料存储
  3. 显示对象信息

5.1.3 代码实现

5.1.3.1 定义类

地瓜属性
定义地瓜初始化属性后期根据程序推进更新实例属性

5.1.3.2 定义烤地瓜方法

5.1.3.3 书写str魔法方法用于输出对象状态

5.1.3.4 创建对象测试实例属性和实例方法

5.1.3.5 定义添加调料方法并调用该实例方法

# 1. 定义类初始化属性被烤和添加调料的方法显示对象信息的str
class SweetPotato():
    def __init__(self):
        # 被烤时间
        self.cook_time = 0
        # 烤的状态
        self.cook_state = '生的'
        # 调料列表
        self.condiments = []
    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 add_condiments(self,condiment):
        # 用户意愿的调料追加到调料列表
        self.condiments.append(condiment)
    def __str__(self):
        return f'这个地瓜的被烤过的时间是{self.cook_time},状态是{self.cook_state},调料有{self.condiments}'
# 2. 创建对象并调用对应的实例方法
digua1 = SweetPotato()
print(digua1)
digua1.cook(2)
digua1.add_condiments('辣椒面儿')
print(digua1)

digua1.cook(2)
digua1.add_condiments('酱油')
print(digua1)

# 这个地瓜的被烤过的时间是0,状态是生的,调料有[]
这个地瓜的被烤过的时间是2,状态是生的,调料有['辣椒面儿']
这个地瓜的被烤过的时间是4,状态是半生不熟,调料有['辣椒面儿', '酱油']

5.2 搬家具

5.2.1 需求

将小于房子剩余面积的家具摆放到房子中

5.2.2 步骤分析

需求涉及两个事物房子+家具
因此案例涉及两个类房子类+家具类

5.2.2.1 定义类

  1. 房子类

a.实例属性
1 房子地理位置
2 房子占地面积
3 房子剩余面积
4 房子内家具列表

b.实例方法
1 容纳家具

c. 显示房屋信息

  1. 家具类
    家具名称
    家具占地面积

5.2.2.2 创建对象并调用相关方法

5.2.3 代码实现

5.2.3.1 定义类

家具类

class Furniture():
    def __init__(self, name, area):
        self.name = name
        self.area = area

# 双人床 占地面积 6
bed = Furniture('双人床', 6)
sofa = Furniture('沙发', 10)

房子类

class Furniture():
    def __init__(self, name, area):
        self.name = name
        self.area = area

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}'
    def add_furniture(self, item):
        """"容纳家具"""
        # 如果 家具占地面积 <= 房子的剩余面积 可以搬入家具列表添加家具名字数据并房子剩余面积更新
        # 房屋剩余面积 - 该家具的占地面积
        # 否则提示用户家具太大剩余面积不足无法容纳
        if item.area <= self.free_area:
            self.furniture.append(item.name)
            self.free_area -= item.area
        else:
            print('提示用户家具太大剩余面积不足无法容纳')



# 双人床 占地面积 6
bed = Furniture('双人床', 6)
sofa = Furniture('沙发', 10)

# 房子1北京 1000
jia1 = Home('北京', 1000)
print(jia1)

jia1.add_furniture(bed)
print(jia1)

ball = Furniture('篮球场', 2000)
jia1.add_furniture(ball)
print(jia1)

# 运行结果
# 房子地理位置在北京, 房屋面积是1000剩余面积是1000, 家具有[]
房子地理位置在北京, 房屋面积是1000剩余面积是994, 家具有['双人床']
提示用户家具太大剩余面积不足无法容纳
房子地理位置在北京, 房屋面积是1000剩余面积是994, 家具有['双人床']

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python