Python_封装案例(小明爱跑步)

1.封装的特性和需求分析

 

封装是面向对象编程的一大特性, 我们在使用面向对象开发程序的时候, 第一步就应该现在需求分析, 然后根据明确的职责把不同的属性和方法封装到一个又一个抽象的类中, 之所以说是抽象, 因为在程序开发中, 类是不能直接使用的。当我们定义好了一个类之后, 就可以在类的代码外部, 使用定义到的类创建出一个又一个对象, 让这些对象来调用我们封装在类的内部的方法, 这个是面向对象编程的一个非常明显的特点。(在外部,类创建对象, 对象调用方法)

对象的方法的实现细节都是封装在类的内部的。

看到需求, 应该使用名词提炼法, 把需求中的名词提炼出来, 有小明, 就可以定义一个 Person() 类, 在Person() 类增加一个name的属性, 让这个name属性来记录一下小明的名字。体重是小明的一个特征, 因此我们再需要定义一个体重weight 的属性, 让weight 来记录小明的体重。

 

明确了小明的两个特征之后,接下来看一下需求中的动词, 我们就在Person() 类 中定义两个方法, 一个跑的方法, 一个吃的方法, 跑步会减肥0.5 公斤, 会影响到体重weight 这个属性, 吃东西同样也会影响到体重这个属性。

利用初始化方法__init__ 来简化一下对象的创建, 同时通过__str__ 这个内置方法来简化一下小明对象的输出, 案例分析完成。

2.案例完成

首先使用class 关键字来定义一个Person 类, 然后使用def 关键字先来找到初始化方法, 初始化方法可以简化对象的创建, 在Person 类中, 我们需要定义两个属性, 一个名字name, 一个体重weight, 这两个属性我们都可以在初始化方法中, 增加两个参数, 由外部来传递进来, 定义两个形参name, weight, 两个形参准备完成, 我们就来定义第一个属性, 在初始化方法中, 要定义属性,应该使用 self.属性名 的格式, 然后使用赋值语句在等号的右侧跟上 形参名, self.name = name , 等号的两侧都写了一个name, 但这两个name不是同样的含义, 把光标放在左侧属性名的name上面, name有一个浅红色的背景,

 

把光标放在右侧的name 上面, 右侧的name 以及初始化方法里的形参中的name, 都会有一个浅紫色的背景。

 

等号右侧是形参, 等号左侧是属性, 虽然都叫name, 等号左右表达的含义是不一样的, 在使用形参来定义第二个属性weight, 然后在等号右侧把weight 的形参传递进来, self.weight = weight 。

 这样一个初始化方法就准备好了, 在初始化方法中定义了两个属性。

接下来再使用另外一个内置方法来简化一下对象的输出, 使用def 关键字, 找到__str__方法, __str__ 方法有个注意事项, __str__方法必须要返回一个字符串, .2f 的作用是保证在输出小数时,小数点后面只保留两位, return "我的名字叫 %s 体重是 %.2f 公斤" % (self.name, self.weight),两个属性 name , weight 传递进来之后, 描述方法我们也准备完成了。

 

先来定义一个跑步的方法run(), 先用pass 关键字占个位置, 搞了一个跑步的空方法, 再使用def 关键字在来定义一个吃东西的方法eat(), 在这个方法中我们同样使用pass 占位符, 定义一个吃的空方法。

 

 这样一个基本的Person类已经准备好了, 有初始化, 有描述, 有跑步, 有吃东西, 把Person类的代码折叠一下, Person 类封装了一些属性和方法。案例的演练需求是小明爱跑步,因此就定义一个小明的变量, 使用Person 类来创建一个xiaoming 的对象, 第一个参数要传入“小明”的名字,第二个参数要传入小明的体重 75.0 ,xiaoming的对象创建完成, 让xiaoming这个对象调用一下跑步的方法, 在让xiaoming 这个对象调用一下吃东西的方法,调用完成, 在使用print函数把xiaoming 这个对象做一个输出, 运行一下程序,控制台输出了“我的名字叫 小明, 体重是 75.00公斤”。

运行结果:

 

 

现在跑步和吃东西的方法的具体实现, 我们还没有完成, 现在把Person 类的代码打开,把光标定位在跑步方法上, 删除掉占位符, 使用一个print 函数做一个输出, print("%s 爱跑步, 跑步锻炼身体" %self.name), 同时在跑步方法中, 我们还需要让xiaoming 的体重减少, 那么我们就使用self.weight 找到xiaoming 的体重属性, 找到之后用 -= 让体重减少0.5公斤, 这样跑步方法就写完了,运行一下程序, 控制台输出了"我的名字叫  小明 体重是 74.50 公斤", 这样xiaoming 这个对象的体重就减少了0.5 公斤。

 

运行结果:

再来调用一下吃东西的方法eat(), 去掉占位符, 还是使用print函数来做一个输出, print("%s 是吃货, 吃完这顿再减肥"  % self.name), 输出完成之后, 我们同样需要对weight 属性做一个修改, 给xiaoming 的体重做一个 +1 , self.weight += 1, 现在吃东西的代码改造完成, 再来运行一下程序,控制台输出“我的名字叫 小明 体重75.50公斤”, 小明的体重增加了1公斤。

运行结果:

 

 

现在整个案例基本上已经演练完成了, 把控制台关掉, 把Person折叠起来, 可以看到, 我们现在完成的主程序中, 只是使用Person 类创建了一个xiaoming 的对象,然后让小明去跑步, 让xiaoming去吃东西, xiaoming 的体重变量, 我们的主程序中没有关心过, 体重包含的代码全部被封装到了跑步和吃东西的方法中。

在对象的方法内部, 能够访问对象自己的属性。比如刚刚在跑步方法中不仅修改了xiaoming 的体重, 同时还输出了xiaoming 的名字,所以这说明在对象的方法内部,是可以直接的访问自己的对象的属性的。

完整代码:

class Person:
    def __init__(self, name, weight):

        #self.属性 = 形参
        self.name = name
        self.weight = weight
    
    def __str__(self):
        return "我的名字叫 %s 体重是 %.2f 公斤" % (self.name, self.weight)

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

        self.weight -= 0.5

    def eat(self):
        print("%s 在吃饭")
        
        self.weight += 1

xiaoming = Person("小明", 75.0)

xiaoming.run()
xiaoming.eat()

print(xiaoming)

运行结果:

 

3.扩展——小美也爱跑步

多个对象属性之间互不干扰

同一个类创建的多个对象之间, 属性是互不干扰的

 

class Person:
    def __init__(self, name, weight):

        #self.属性 = 形参
        self.name = name
        self.weight = weight
    
    def __str__(self):
        return "我的名字叫 %s 体重是 %.2f 公斤" % (self.name, self.weight)

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

        self.weight -= 0.5

    def eat(self):
        print("%s 在吃饭" % self.name)
        
        self.weight += 1

xiaoming = Person("小明", 75.0)

xiaoming.run()
xiaoming.eat()

print(xiaoming)


xiaomei = Person("小美", 45.0)

xiaomei.run()
xiaomei.eat()

print(xiaomei)

运行结果:

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值