京公网安备 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-08-24在MySQL数据库中,InnoDB存储引擎作为主流事务型引擎,默认事务隔离级别为可重复读(Repeatable Read,RR),这与SQL Server、Or ...
2026-08-24 很多数据分析师拿到数据就开始清洗、建模,但当被问到“这批数据属于什么类型——结构化还是非结构化?分类变量还是数值变量 ...
2026-08-24 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-08-21在数据分析与数据可视化工作中,直方图是展示数据分布特征、离散程度、集中区间的核心图表,能够直观呈现数值数据的频次分布规律 ...
2026-08-20在数据分析领域有一句核心准则:垃圾数据进,垃圾数据出。数据清洗是数据分析、数据建模、数据可视化之前的必经前置工序,也是保 ...
2026-08-20 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-08-20在Python数据分析与数据清洗工作中,Pandas是最核心的数据处理库,DataFrame是结构化数据的标准存储格式。在实时数据采集、循环 ...
2026-08-19在零售行业大数据分析与精细化运营领域,纸尿裤旁摆放啤酒是最经典、最具代表性的商业案例。两种看似毫无关联的商品,一个是婴幼 ...
2026-08-19 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-08-19在数据分析、业务监控、质量检测与风险管控工作中,数据波动性是衡量数据稳定性、业务健康度、结果可信度的核心依据。数据波动代 ...
2026-08-18很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当导致 ...
2026-08-18在数据分析、业务评价、产品评级、用户分层与综合决策场景中,单一指标往往无法全面、客观地评价事物整体水平。现实中的评价对象 ...
2026-08-18在数理统计、假设检验、数据分析与机器学习领域中,卡方分布(χ²分布)是继正态分布、t分布之后最重要的连续型概率分布之一。 ...
2026-08-17在Python数据清洗、文本校验、账号密码规则校验、脏数据过滤、字符串规整化处理中,正则表达式是最高效、最常用的文本匹配工具。 ...
2026-08-17 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-08-17手游行业具备用户迭代快、竞争激烈、用户粘性易流失的典型特征。随着新游持续上线、玩家审美升级、玩法疲劳等问题出现,存量用户 ...
2026-08-14在数字化产品运营、商业数据分析、业务增长管理中,零散的指标统计无法支撑系统性的业务决策。单一的点击率、转化率、销量数据只 ...
2026-08-14 很多数据分析师每天都在写SQL,但当被问到“数据查询语言(DQL)的本质是什么”“SELECT语句中各子句的书写顺序与实际执行顺 ...
2026-08-14在数据库数据分析、数据清洗、报表统计与业务查询场景中,日期时间是最高频、最核心的基础字段。数据库中存储的日期格式多样,包 ...
2026-08-13