京公网安备 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
在互联网运营、产品优化、用户增长等领域,次日留存率是衡量产品价值、用户粘性与运营效果的核心指标,更是判断新用户是否认可产 ...
2026-05-09相关性分析是数据分析领域中用于探究两个或多个变量之间关联强度与方向的核心方法,广泛应用于科研探索、商业决策、医疗研究、社 ...
2026-05-09 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-05-09在数据驱动运营的时代,指标是连接业务目标与实际行动的核心桥梁,是企业解读业务现状、发现问题、预判趋势的“量化标尺”。一套 ...
2026-05-08在存量竞争日趋激烈的商业时代,“以客户为中心”早已从口号落地为企业运营的核心逻辑。而客户画像作为打通“了解客户”与“服务 ...
2026-05-08 很多数据分析师每天与Excel打交道,但当被问到“什么是表格结构数据”“它和表结构数据有什么区别”“表格结构数据有哪些核 ...
2026-05-08在数据分析、计量研究等场景中,回归分析是探究变量间量化关系的核心方法,无论是简单的一元线性回归,还是复杂的多元线性回归、 ...
2026-05-07在数据分析、计量研究等场景中,回归分析是探究变量间量化关系的核心方法,无论是简单的一元线性回归,还是复杂的多元线性回归、 ...
2026-05-07 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-05-07在数字化时代,商业竞争的核心已从“经验驱动”转向“数据驱动”,越来越多的企业意识到,商业分析不是简单的数据统计与报表呈现 ...
2026-05-06在Excel数据透视表的实操中,“引用”是连接透视表与公式、辅助数据的核心操作,而相对引用作为最基础、最常用的引用方式,其设 ...
2026-05-06 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-05-06在Excel数据分析中,数据透视表是汇总、整理海量数据的高效工具,而公式则是实现数据二次计算、逻辑判断的核心功能。实际操作中 ...
2026-04-30Excel透视图是数据分析中不可或缺的工具,它能将透视表中的数据快速可视化,帮助我们直观捕捉数据规律、呈现分析结果。但在实际 ...
2026-04-30 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-04-30在中介效应分析中,人口统计学变量(如年龄、性别、学历、收入、职业等)是常见的控制变量或调节变量,其处理方式直接影响分析结 ...
2026-04-29在SQL数据库实操中,日期数据的存储与显示是高频需求,而“数字日期”(如20240520、20241231、45321)是很多开发者、数据分析师 ...
2026-04-29 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-04-29在手游行业竞争日趋白热化的当下,“流量为王”早已升级为“留存为王”,而付费用户留存率更是衡量一款手游盈利能力、运营质量的 ...
2026-04-28在日常MySQL数据库运维与开发中,经常会遇到“同一台服务器上,两个不同数据库(以下简称“源库”“目标库”)的表数据需要保持 ...
2026-04-28