京公网安备 11010802034615号
经营许可证编号:京B2-20210330
来源:麦叔编程
作者:麦叔
设想一下,你如何开发下面这个游戏:
很难想象,用简单的字符串,int, list等数据类型就能表达和开发出这么复杂的游戏(实际上是可以的,只是很麻烦)。
更好的做法是使用面向对象的技术。这个游戏无非就是一个个对象互相打打杀杀!
编程是对现实世界的模拟,我们先来看看面向对象的几个核心概念:
在早期的编程语言中,比如C语言中,是没有面向对象的概念的,所有的程序,不管多么复杂,都是用数字,字符串等来表达的。那时候我们称为面向过程编程。
面向过程编程:Procedure Oriented Programming 是一种以过程和任务为中心的编程思想。通过一系列具体的步骤操作相关的数据,实现软件功能。
面向对象编程
Object Oriented Programming 是一种以对象为基础的编程思想。把数据和操作封装到对象中,通过对象一系列的交互,实现软件功能。
下面我用一个小的例子带你理解面向对象。
假设有两条狗,他们分别有自己的名字,身高,血量和攻击力。我们要模拟一条狗攻击了另外一条狗。
#表示狗的属性 dog1_name = '大黄'
dog1_height = 0.7
dog1_blood = 1.0
dog1_power = 0.1
dog2_name = '二黑'
dog2_height = 0.7
dog2_blood = 1.0
dog2_power = 0.2 #dog1攻击dog2 print('dog1 attacking dog2')
dog2_blood = dog2_blood - dog1_power #dog2攻击dog1 print('dog2 attacking dog1')
dog1_blood = dog1_blood - dog2_power
这显然不好,如果有100条狗互相乱咬呢?
我们来看看面向对象的写法:
#类是一个模板 class Dog: #构造方法 def __init__(self, name, height, blood, power):
self.name = name
self.height = height
self.blood = blood
self.power = power
def attack(self, dog2):
dog2.blood = dog2.blood - self.power
d1 = Dog('大黄', 0.7, 10, 3) #创建第1个实例 d2 = Dog('二黑', 0.5, 10, 4) #创建第2个实例 print(f'攻击前:{d2.blood}')
d1.attack(d2)
print(f'攻击后:{d2.blood}')
这虽然看起来代码比上面还长,但是代码很自然,更容易懂,更有“人性”。
如果我们要创建100个Dog,也很容易。把这100个Dog放到一个列表中也很方便。
下面我们来庖丁解牛,从零开始学习面向对象的核心概念。
我们再回到前面的例子,从零开始,理解类的核心概念。
#最简单的类 class Dog: 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__的方法。前面的Dog中没有init方法,它就给我们创建了一个空的对象出来。实际上Python调用了Object类的init方法,这个方法不需要传任何参数,也不做任何事情。
现在我们给Dog类加上__init__方法:
#类是一个模板 class Dog: #构造方法 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:
并不是所有的属性都一定要在构造方法中传入,比如我们规定:blood在创建的时候默认都是10,也就是满血。
那么就没必要在init中传入这个参数了。我们可以在init函数中设置默认的值为10。
class Dog: #构造方法 def __init__(self, name, height, power):
self.name = name
self.height = height
self.blood = 10 self.power = power
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA数据分析师 出品 作者:李诗怡 一、数据处理概述 定义: 在正式开展数据分析之前,对原始采集的数据进行整理、修正、加工和精 ...
2026-11-06一、为什么数据要先标准化 拿到一份数据,各列的量纲往往完全不同:年龄单位是"岁"(约 20~60),收入单位是"元"(几千到几万) ...
2026-11-06一、为什么 Python 成了统计分析的主流工具 十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06“大学生必备证书有哪些”最容易被答成一张越长越好的清单。但校招筛选的真实逻辑是:证书要对应你投的岗位任务,并且在校期间确 ...
2026-11-05大学期间能报的证书,先别急着看“含金量榜单”。更实用的第一步是问:我现在这个身份、这个学历,符合报考条件吗? 很多证书宣 ...
2026-11-05大学期间能考的证书很多,但真正需要先回答的是两个问题:当前有没有报考资格,以及这张证书对应什么岗位任务。 前者决定你能不 ...
2026-11-05先把结论说清楚:真正“只有在校大学生能考、毕业就彻底没资格”的证书数量不多,主要集中在语言类考试的部分专项、面向高校学生 ...
2026-11-05上班族问“考什么证书有用”,真正要解决的不是找一张“最值钱”的证,而是判断哪张证能嵌进你现有的岗位任务。同样一张证书,做 ...
2026-11-05职称证书不是统一的考试项目。同样“考职称”,经济、会计、统计、审计、软考走全国统一考试,工程、教师、卫生等系列多数走评审 ...
2026-11-0533岁选证书,最怕两件事:一是被“适合女生”的清单带着走,考完发现岗位用不上;二是投入大半年,报名时才发现学历、专业或工作 ...
2026-11-05“女生容易考的证书”这个问题,真正难的不是找一份名单,而是判断“容易”到底指什么。报名条件宽松、考试通过率高、拿证后能找 ...
2026-11-05“女生适合考什么证书”这类搜索,背后往往是同一个困惑:网上榜单太多,口径却说不清楚。有人把培训证书和职业资格混在一起排, ...
2026-11-05先把结论说清楚:没有一张证书对所有人都“又好考又实用”。同一个证,对在校生可能报名门槛都过不了,对有三年工作经验的人却只 ...
2026-11-05“考证书有哪些”这个问题,如果只想要一份名单,网上能搜到成百上千个。但真正有用的答案不是“有哪些”,而是“它们分别是什么 ...
2026-11-05“考什么证好一点”这句话,十个人问可能有十个意思。有人想问哪个证容易过,有人想知道哪个证找工作管用,还有人关心哪个证长期 ...
2026-11-05“考哪些证书最吃香”很难用一张榜单回答。同一张证书,在有的岗位是硬门槛,在另一些岗位只是加分项;对在校生和在职者的价值也 ...
2026-11-05家庭主妇能考的证书不少,但真正值得花时间的,不是“哪个证热门”,而是先确认你当前能不能报,再按每周可投入时间和未来出口缩 ...
2026-11-05“国家认证的职业技能证书”并不是某一本证书的正式名称,而是一句被大量使用的宣传口径。它可能指向人社部门的国家职业资格、备 ...
2026-11-05