京公网安备 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数据分析师 出品 作者:李诗怡 1. VLOOKUP:按行跨区域找数据(最常用) 作用:在指定的表格或数据区域的第一列里找目标值, ...
2026-10-23数据敏感度不是天赋,也不是“看一眼数字就能发现问题”的直觉。对市场专员来说,它更接近一套可练习的工作习惯:看到投放ROI、 ...
2026-10-23市场营销专员转数据分析,不是从零重来。你已有的渠道投放、活动执行、线索跟进经验,本身就是分析工作的原料——缺的不是业务理 ...
2026-10-23先说结论:市场岗位并非必须考数据分析证书。招聘方更常看的是你能否把渠道效果、活动ROI、线索转化这些业务问题讲清楚,证书只 ...
2026-10-23市场分析师的职场知识提升,最怕两件事:一是把“学工具”当成学习本身,Excel、SQL、Python轮着学一遍,回到工作里还是不知道怎 ...
2026-10-23市场分析师的通用技能可以归为五块:业务与市场理解、调研与竞品分析、用户与渠道数据分析、指标与分析表达、工具操作。它们不是 ...
2026-10-23市场分析师的核心技能,可以先用一个框架回答:懂业务与市场、能取数与处理数据、会指标与分析方法、能把洞察讲清楚。这四块是共 ...
2026-10-23市场策划不是“会写文案、能办活动”这么简单。它本质上是一个用创意和资源撬动业务结果的岗位:先理解市场和人群,再形成方案, ...
2026-10-23社群运营不是“拉群、发通知、维护气氛”这么简单。它真正要对的结果是:用户进得来、留得住、愿意互动、最终产生转化或复购。因 ...
2026-10-23营销人的能力提升计划,最容易做成一张课程清单:报名几门课、读完几本书、考一个证,年底回头看,工作方式却没变。问题不在努力 ...
2026-10-23人力资源专员的职场价值,不由“做了多少事”决定,而由“解决什么问题、留下什么成果”决定。同样做招聘、算考勤、办入离职,有 ...
2026-10-23产品经理的职场价值,不主要由会画原型、会写文档决定,而由能否用业务结果证明自己的判断与推动决定。同一岗位的人价值差距大, ...
2026-10-23运营专员的能力提升,最容易走偏成两件事:一是把市面上所有工具都学一遍,二是把沟通、协作这类通用能力当成唯一答案。更有效的 ...
2026-10-23市场总监的沟通与管理,难点通常不在话术,而在三件事能否同时成立:向上用结论和数据对齐目标,平级用共同指标换取协同,向下用 ...
2026-10-23市场分析师的沟通失分,往往不是“嘴笨”,而是三件事没做好:结论没提炼出来、指标口径没对齐、建议没有落到决策上。所以提升沟 ...
2026-10-23社群运营做久了,很容易陷入一种忙碌:每天在群里发内容、回消息、做活动,热闹的时候很热闹,可一到月底复盘,说不清哪些动作带 ...
2026-10-23品牌运营的技能提升,最容易走偏的一步是先报课、先学工具。更有效的顺序是:先沿“品牌定位与策略—内容与传播—渠道与活动执行 ...
2026-10-23营销人员想赢得客户信任,单靠话术和关系维护越来越不够。客户在签约前会追问:你懂我的业务吗?方案里的数字怎么来的?承诺的效 ...
2026-10-23APP运营专员的能力提升,容易陷入两种误区:一是把“会用工具”当成能力全部,学了一堆Excel函数和SQL语法,回到岗位仍说不清一 ...
2026-10-23社群运营的沟通难点,不在于“会不会说话”,而在于同一件事要对三类人说清楚:对用户要安抚情绪、给出确定答复;对产品、活动、 ...
2026-10-23