-
面向对象和面向过程区别
1.面向过程:把完成某一个需求的所有步骤从头到尾逐步实现。这过程中可以将某些独立代码封装成函数,完成代码就是顺序的调用函数
2.面向过程的特点:注重步骤,不注重职责分工
3.面向对象:首先梳理职责-即要做的事情(方法),第二部根据方法确定不同的对象,在对象内部封装多个方法,最后顺序地让不同对象调用不同方法
4.面向对象的例子:
-
类和对象
类和对象是面向对象编程的两个核心概念
1.类:一群具有相同特征或者行为的事物的抽象概括,里面包含属性和方法两个元素。类像是图纸,用于创建对象。类的定义满足大驼峰命名法。如CustomerName
2.对象:由类创建的具体存在,具有该类的属性和方法
3.类和对象:先有类,后有对象。类有1个可对应多个对象
-
类的属性和方法
1.属性:对对象的特征描述
2.方法:对象的行为
3.语法:Python中要定义一个只包含方法的类
class 类名:
def 方法1(self, 参数列表):
内容
def 方法2(self, 参数列表):
内容
#方法的定义格式和之前学习过的函数几乎一样
#区别在于第一个参数必须是 self
4.语法: 当一个类定义完成之后,要使用这个类来创建对象,语法格式如下
对象变量 = 类名()
5.语法: 对象调用属性和方法
类的外部:对象名. 属性 对象名. 方法
类的内部:self.属性 self.方法(本质上和上一行一样)
self代表什么?
1.self的本质是调用该方法的对象,本质是对象。比如上文定义的类。如果该类创建了两个对象a和b
如果a调用了方法1,那么self就代表对象a
如果b调用了方法1,那么self就代表对象b
2.定义函数和方法的差距就是定义方法时,括号中必须有self。因为方法毕竟是在类中定义的,就一定会包含谁引用+参数两个内容。
3.如果是在类封装内部调用属性和方法,用self.属性/方法即可。此处self代表调用方法的对象自己。
4.定义方法时候有self,调用的时候不同传递self参数,因为调用的语法对象名.已经包含了
-
初始化方法--重点在用,理解难点
1.当使用类名()创建对象时,会自动执行以下操作:
a. 为对象在内存中分配空间—— 创建对象
b. 为对象的属性设置初始值—— 初始化方法(init)
这个初始化方法就是 __init__方法,__init__是对象的内置方法
2.初始化方法作用:为对象属性赋初始值以及快速赋值
在__init__方法内部使用 self. 属性名 = 属性的初始值就可以定义属性
class Emp:
def __init__(self,no,name,salary):
#self. 属性名 = 属性的初始值。比如第一个前面的no是属性,后面的no是变量
self.no=no
self.name=name
self.salary=salary
def work(self):
return '%s员工,工作努力,每月赚%d元钱'%(self.name,self.salary)
#定义对象后面括号的内容就是默认给初始化方法输入数据,而且快速的给属性赋值
emp1=Emp('1001','张小凡',12000)
str=emp1.work()
print(str)
print(emp1.no)
张小凡员工,工作努力,每月赚12000元钱
1001
作业1:通过定义类实现植物大战僵尸游戏制作,游戏如下图所示
import time
class Corpse:
def __init__(self,name,blood,harm):
self.name=name
self.blood=blood
self.harm=harm
def bite(self):
print('%s咬了一下,伤害值:%d'%(self.name,self.harm))
class Shooter:
def __init__(self,name,blood,harm):
self.name=name
self.blood=blood
self.harm=harm
def bite(self):
print('%s发射豌豆,伤害值:%d'%(self.name,self.harm))
s1=Shooter('豌豆射手',50,10)
s2=Shooter('冰冻射手',100,30)
c1=Corpse('普通僵尸',100,15)
c2=Corpse('铁通僵尸',120,40)
while s1.blood>0 and c1.blood>0:
s1.bite()
c1.blood-=s1.harm
time.sleep(1)
s1.bite()
c1.blood -= s1.harm
time.sleep(1)
c1.bite()
s1.blood-=c1.harm
time.sleep(1)
if s1.blood>0:
print('%s获胜,剩余血量%d'%(s1.name,s1.blood))
else:
print('%s获胜,剩余血量%d' % (c1.name, c1.blood))
豌豆射手发射豌豆,伤害值:10
豌豆射手发射豌豆,伤害值:10
普通僵尸咬了一下,伤害值:15
豌豆射手发射豌豆,伤害值:10
豌豆射手发射豌豆,伤害值:10
普通僵尸咬了一下,伤害值:15
豌豆射手发射豌豆,伤害值:10
豌豆射手发射豌豆,伤害值:10
普通僵尸咬了一下,伤害值:15
豌豆射手发射豌豆,伤害值:10
豌豆射手发射豌豆,伤害值:10
普通僵尸咬了一下,伤害值:15
普通僵尸获胜,剩余血量20
作业2:创建员工类包括姓名、工资的属性和工作的方法,创建2个员工对象分别调用工作的方法,通过初始化方法为属性赋值。
class Emp:
def work(self):
print('%s努力工作,每月能赚%d元'%(self.name,self.salary))
def __init__(self,name,salary):
self.name=name
self.salary=salary
e1=Emp('张小功',6000)
e2=Emp('王强',6500)
e1.work()
e2.work()
张小功努力工作,每月能赚6000元
王强努力工作,每月能赚6500元