头图

一、了解面向对象的封装

封装是面向对象编程的一大特性,当我们面向对象编程的时候第一步就是先做需求分析然后根据明确的职责将不同的属性和方法封装到一个又一个抽象的类中。之所以说是抽象的类,因为在开发程序中类是不能直接使用的,当定义好一个类之后,在外界也就是类的代码外部来使用类创建对象,然后再让这个对象去调用我们封装在类中的各个方法。

强调一点:对象方法的细节都是被封装在类的内部的,在外界只需要使用类创建对象,然后让对象调用方法。

总结:

  1. 封装是面向对象编程的一大特点
  2. 面向对象编程的第一步:将属性和方法分装到一个抽象的类中
  3. 外界使用类创建对象,然后让对象调用方法
  4. 对象方法的细节都被封装在累的内部

二、封装案例——小夏爱跑步

2.1 需求分析

需求:

  1. 小夏体重55.5公斤
  2. 小夏每次跑步会减体重0.5公斤
  3. 小夏每次吃东西体重会增加1公斤

当看到需求后,应该用名词提炼法把需求中的名词提炼出。在需求中可以看出有个叫小夏的人类,那么可以定义一个叫做Person的类,在这类中然后看出这个人类的其他属性特征,比如名字和体重分别用name和weight来记录。以上是需求中的名词属性接下来看需求中的动词,不难看出跑步和吃东西是动词,那么在类中定义两个方法,一个run(self)一个eat(self)。再看需求,跑步和吃饭都会影响到体重这个属性,每次跑步会减体重0.5公斤,每次吃东西体重会增加1公斤。

这个案例主要复习之前的__init__初始化方法,利用这个初始化方法来简化对象的创建,同时复习一下__str__这个内置方法,通过这个方法来简化一下小夏对象的输出。

2.2 代码

下图是完成了一大半的代码,剩下两个方法没有完成,目前用pass占位符代替,只是先看看代码总体有没有出错,是否可以正常运行,结果显示时没问题的。接下来在写类中具体的两个方法。

图片

完整代码:

class Person:
    # 初始化方法:简化对象的创建
    def __init__(self, name, weight):
        # self.属性 = 形参
        self.name = name
        self.weight = weight

    # 内置方法__str__(self):简化对象的输出
    def __str__(self):
        # 这个方法需要注意必须要返回一个字符串
        # .2f 表示在遇到小数的时候只保留2位小数
        return "我的名字叫 %s 体重是%.2f 公斤" % (self.name, self.weight)

    def run(self):
        print("%s 爱跑步,跑步可以锻炼身体也可以减肥" % self.name)

        # 每次跑步体重减少0.5公斤
        self.weight -= 0.5

    def eat(self):
        print("%s 爱吃,是个吃货" % self.name)

        # 每次吃东西体重增加1公斤
        self.weight += 1


# 创建小夏对象
xiaoxia = Person("小夏", 55.5)

xiaoxia.run()
xiaoxia.eat()

print(xiaoxia)

运行结果:

图片

代码总结:

图片

上图中折叠了Person类,在类的外部创建了叫小夏的对象,在对象中传入参数名字和体重,然后对象去调用在类中的两个方法,最后输出这个对象。

提示:在对象的方法内部是可以直接访问对象的属性的。

如下图:在案例中不仅输出了小夏的名字还同时修改了小夏的体重

图片

三、案例扩展——多个对象之间属性互不干扰

小夏爱跑步扩展之小菜也爱跑步。
需求:

  1. 小夏爱跑步,小菜也爱跑步
  2. 小夏体重55.5公斤
  3. 小菜体重60公斤
  4. 每次跑步都会减少0.5公斤
  5. 每次吃东西都会增加1公斤

3.1需求分析

分析:

分别有小夏和小菜两个人物,可以看做是两个对象,他们各自都有各自的体重。同样可以使用一个Person类,在这个类中定义两个属性,一个name,一个 weight。体重每次跑步和吃东西都会变化,这2个方法的描述是完全一样的意味着在类中分装的2个代码具体的代码实现也是完全相同的,只是在这两个方法执行过程中各自修改不同对象的体重属性。代码是一样的,但是修改的属性是根据调用的对象不同而不同。

3.2代码

只是在上面的代码中创建一个小菜对象,小菜对象再去调用跑步和吃东西的方法,左后输出小菜这个对象。

提示:同一个类创建的多个对象之间,属性互不干扰。

具体代码如下图:

图片

结果分析:

运行完小菜对象的代码后可以看出并不会影响到小夏的体重变化,这个因为代码在运行的过程中,在28行先在内存中开辟一个空间来存储小夏对象的两个属性一个名字一个体重,再执行下面两个方法,最后输出小夏对象。然后运行到36行代码创建小菜对象,在内存中同样开辟另外一个空间分别存储name和weight,执行两个方法,最后输出小菜对象。在这一列过程中,两个对象之间的属性并没有被互相干扰到。

图片

面向对象编程中使用同一个类可以创建出不同的对象,根据实际的场景每一个对象的属性会各自发生变化,但是多个对象之间属性彼此是互不干扰的。

以上就是关于面向对象案例的一个小小分析和代码演练,更多Python练习题可以关注Python自学网,不断更新。www.wakey.com.cn/


村长
7 声望4 粉丝