Python的面向对象编程 - Go语言中文社区

Python的面向对象编程


1.前言:什么是面向对象编程和面向过程编程?

1.1面向过程编程

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用

以下是来自度娘的部分介绍

面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。比如拿学生早上起来这件事说明面向过程,粗略的可以将过程拟为:

(1)起床

(2)穿衣

(3)洗脸刷牙

(4)去学校

而这4步就是一步一步地完成,它的顺序很重要,你只需要一个一个地实现就行了。而如果是用面向对象的方法的话,可能就只抽象出一个学生的类,它包括这四个方法,但是具体的顺序就不一定按照原来的顺序

听了上面的介绍可能有些恍然大悟的样子,但可能普通人并不能马上理解这个过程白居易曰:卖菜大娘看不懂我的诗,那就不是好诗~~)。

据本猿理解,我们编程的目的是干什么?大多数是实现某个过程。程序本身是人设计好的一段代码,而在设计这段代码的时候总要有个先做什么,再做什么和最后做什么,这个就是过程的体现,不论是何种编程都会有这样的思想,只不过在描述多个事物的时候,面向对象编程更易简便实现。

1.2 面向对象编程

那么面向对象编程与面向过程编程的区别在哪里呢?我们现在来打个比方:

面向过程是当你想吃西红柿炒鸡蛋的时候,必须要先会做这道菜,而且还要去买西红柿,买鸡蛋,回来之后自己动手洗、切、炒,最后才能吃上。而面向对象就是不用管你会不会做,只要是你想吃西红柿炒鸡蛋的时候,去饭店对厨师说:“老板,来个炒鸡蛋”,然后就可以吃上了。

接下来我们看一下怎么使用Python进行面向对象编程。

2 面向对象编程

2.1 Python中的类、属性、方法和对象

“物以类聚,人以群分”这句话经常挂在人们的嘴边,类可以理解为具有相同属性的共同体,人本身属于人类中的一个属(生物学划分),在这个类中除了人之外,还有类人猿。人和类人猿都有眼睛、耳朵、鼻子等等共有的属性,除此之外,他们会使用工具,直立行走,用语言交流等方法。那么面向对象就是根据具有相同属性和方法类创建出人或者类人猿这样的实例,也称对象,而这个创建对象的过程称为实例化。用鸟做类比,可以根据鸟类的一些共有属性和方法创造出一只生动形象的鸟。

 2.2 面向对象编程语法

2.2.1 使用单个类创建单个对象

问题描述:小明家有很多家具,有床、餐桌和椅子...他们的占地面积分别为10、5、2平米。

Python面向对象编程创建出实例床和餐桌:

#!/usr/bin/python
#1 先创建家具类
class Home_item:
    def __init__(self,name,area):
        self.name = name
        self.area = area
    def __str__(self):
        return "[%s]:占地 %.2f平米" %(self.name,self.area)

#2 使用类依次创建床和餐桌
bed = Home_item("床",12)
desk = Home_item("餐桌",5)
print(bed)
print(desk)

这个问题中的类和对象:

其中调用了两个内置方法,init进行初始化,可以由外界传入形参name和area,而str则是用于输出对象bed和desk的信息(return的结果输出到print要打印的信息中去,否则print打印的是对象的内存地址)。

2.2.1一个类的属性是另一个类的实例

问题描述:

士兵许三多,会用AK47枪开火消灭敌人。

Python代码:

#!/usr/bin/python
class gun:
    def __init__(self,model):
        #1.gun的型号introduced from outdoors
        self.model = model
        #initial value is 0
        self.count =  0
    def add_bullet(self,count):
        #count是由add_bullets方法传入
        self.count = count
        print("[%s]has[%d]bullets..."%(self.model,self.count))
    def shoot(self):
        #as we have enough data, so we can shoot?
        #1.check if gun has bullets
        if self.count <=0:
            print("[%s]has not bullets"%(self.model))
            return
        #2. shoot it
        self.count -=1
        #self.count必须在初始化中定义一下
        print("[%s]突突突...[剩余%d发] "%(self.model,self.count))
#
class solider:
    def __init__(self,name):
        self.name = name
        self.gun = None
    def fire(self):
        #1.check whether if %s has not guns
        if self.gun==None:
            print("[%s]has not guns!"%self.name)
            return
        self.gun.add_bullet(50)
        self.gun.shoot()

#主程序:
#1.创建AK47枪并装填子弹,尝试射击
ak47 = gun("AK47")

print(ak47)
#2.创建士兵许三多,并让他开枪
xusanduo = solider("许三多")
#外界引入许三多的枪为ak47
xusanduo.gun = ak47
xusanduo.fire()
print(xusanduo)

题目中有2个类,一个类是士兵,有两个属性,名字和扛枪,有一个方法是消灭敌人;另一个类是枪,有两个属性:枪型和子弹数目,有两个方法:增加子弹和开枪。

两个对象:许三多和AK47枪

由gun类创建的ak47对象是士兵solider的属性,那么gun的方法相应地可以遗传给solider。(Python是自上向下执行的,因此必须先指定gun类,再指定solider类)

PS:程序中有一个关键词None,使用None可以代替暂时不知道的属性,可以使用外部制定输入self.gun = ak47来指定士兵属性,程序中写了固定的装填子弹数目50,也可以改一下这个地方,实现提示让用户输入数量。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39056447/article/details/88782209
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-18 22:08:16
  • 阅读 ( 800 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢