python中面向对象_不会面向对象,肯定学不好!简易的Python面向对象攻略来啦

来源:麦叔编程

作者:麦叔

1. 第一个类

面向对象的概念

设想一下,你如何开发下面这个游戏:

72712341b4a55dba90b09a9cb5e02ee5.png

很难想象,用简单的字符串,int, list等数据类型就能表达和开发出这么复杂的游戏(实际上是可以的,只是很麻烦)。

更好的做法是使用面向对象的技术。这个游戏无非就是一个个对象互相打打杀杀!

编程是对现实世界的模拟,我们先来看看面向对象的几个核心概念:

类 - 模板,如人类实例 - 用模板造出的对象,如貂蝉属性 - 是特征,如姓名方法 - 是行为,是技能,如攻击在早期的编程语言中,比如C语言中,是没有面向对象的概念的,所有的程序,不管多么复杂,都是用数字,字符串等来表达的。那时候我们称为面向过程编程。

面向过程编程:Procedure Oriented Programming 是一种以过程和任务为中心的编程思想。通过一系列具体的步骤操作相关的数据,实现软件功能。

面向对象编程

Object Oriented Programming 是一种以对象为基础的编程思想。把数据和操作封装到对象中,通过对象一系列的交互,实现软件功能。

下面我用一个小的例子带你理解面向对象。

假设有两条狗,他们分别有自己的名字,身高,血量和攻击力。我们要模拟一条狗攻击了另外一条狗。

面向过程的代码可能是这样的

#表示狗的属性dog1_name = '大黄'dog1_height = 0.7dog1_blood = 1.0dog1_power = 0.1dog2_name = '二黑'dog2_height = 0.7dog2_blood = 1.0dog2_power = 0.2#dog1攻击dog2print('dog1 attacking dog2')dog2_blood = dog2_blood - dog1_power#dog2攻击dog1print('dog2 attacking dog1')dog1_blood = dog1_blood - dog2_power

这显然不好,如果有100条狗互相乱咬呢?

我们来看看面向对象的写法:

面向对象的代码

#类是一个模板classDog:#构造方法def__init__(self, name, height, blood, power): self.name = name self.height = height self.blood = blood self.power = power defattack(self, dog2): dog2.blood = dog2.blood - self.powerd1 = Dog('大黄', 0.7, 10, 3) #创建第1个实例d2 = Dog('二黑', 0.5, 10, 4) #创建第2个实例print(f'攻击前:{d2.blood}')d1.attack(d2)print(f'攻击后:{d2.blood}')

首先创建了一个Dog类,它包含了4个属性,和一个方法。接下来,我们就像女娲造人一样,用Dog类作为模板,构建出两个狗d1和d2。然后d1攻击了d2。这虽然看起来代码比上面还长,但是代码很自然,更容易懂,更有“人性”。

如果我们要创建100个Dog,也很容易。把这100个Dog放到一个列表中也很方便。

下面我们来庖丁解牛,从零开始学习面向对象的核心概念。

2.构造方法和属性

我们再回到前面的例子,从零开始,理解类的核心概念。

最简单的类

#最简单的类classDog:pass

这是一个最简单的类,它里面什么都没有,就像一个空白的信封。注意类的定义以class开头,后面是类的名字,类名一般用大写。

创建实例

虽然它什么都没有,但我们仍然可以用它来创建实例。

d1 = Dog()d2 = Dog()print(id(d1))print(id(d2))

创建实例通过使用类名加括号,有的类需要传入参数。通过下面的打印可以看出d1和d2的内存地址不同,他们确实是不同的实例,在内存里有自己独立的房间。

Python是一个动态语言,我们可以给类动态的添加属性:

d1.name = '旺财'print(d1.name)print(d2.name) #报错,因为d2没有name属性

正常情况下类不是空的,我们要求创建实例的时候就必须填写必要的信息,这样才是一个有效的实例。

构造方法 init

我们创建实例的过程,会调用了一个叫做__init__的方法。前面的Dog中没有init方法,它就给我们创建了一个空的对象出来。实际上Python调用了Object类的init方法,这个方法不需要传任何参数,也不做任何事情。

现在我们给Dog类加上__init__方法:

#类是一个模板classDog:#构造方法def__init__(self, name, height, blood, power): self.name = name self.height = height self.blood = blood self.power = power

这时候如果再去创建Dog的实例,而不传入参数就会报错了:

d1 = Dog() #报错,必须要传入指定的参数

init函数的第一个参数永远是self,表示当前对象,表示自己。后面的参数看我们自己的需要,我们希望Dog类有name, height, blood和power等几个属性,所以我们就加了这几个参数。

现在来正常的创建两个实例:

d1 = Dog('大黄', 0.7, 10, 3) #创建第1个实例d2 = Dog('二黑', 0.5, 10, 4) #创建第2个实例

创建实例的时候,不需要传入第一个self参数,Python会自动传入。我们只要传入self后面的几个参数就行。注意参数的顺序。

self和属性

这里需要认识一下self:

self表示当前的实例。self只用在类的内部,在外部就直接使用变量名了,如d1,d2通过self.name='XXX'就给当前实例创建了一个名为name的属性。不同实例的属性的值是不同的。默认属性

并不是所有的属性都一定要在构造方法中传入,比如我们规定:blood在创建的时候默认都是10,也就是满血。

那么就没必要在init中传入这个参数了。我们可以在init函数中设置默认的值为10。

classDog:#构造方法def__init__(self, name, height, power): self.name = name self.height = height self.blood = 10self.power = power

访问和修改属性

在类的内部,通过self.xxx访问属性在类的外部,通过变量名 d1.xxx访问属性修改属性,用赋值语句赋值即可:外部:d1.name = '大黄黄'。内部:self.name = '大黄黄'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值