面向对象编程
面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑
面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设 计、实现软件的办法。
面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
举例:
解决吃啤酒鸭的问题
第一种方式(面向过程):
1)养鸭子
2)鸭子长成
3)杀
4)作料
5)烹饪
6)吃
7)卒
第二种方式(面向对象):
1)找个卖啤酒鸭的人
2)给钱 交易
3)吃
4)胖6斤
类和对象
面向对象编程的2个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象
1.类
类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找到多个对象
2.对象
某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。
可以是直接使用的
3.类与对象之间的关系
类就是创建对象模板
未来的一个概念就是类
举例:区分类和对象
奔驰汽车 类
奔驰smart 类
张三的那辆奔驰smart 对象
狗 类
大黄狗 类
李四家那只大黄狗 对象
水果 类
苹果 类
红苹果 类 红富士苹果 类
我嘴里吃了一半的苹果 对象
类的构成
类(Class) 由3个部分构成
类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法 (行为)
举例:
狗类的设计
类名:狗(Dog)
属性:品种 、毛色、性别、名字、 腿儿的数量
方法(行为/功能):叫 、跑、咬人、吃、摇尾巴
类的抽象
拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
方法:一般名词都是类(名词提炼法)
<1> 坦克发射3颗炮弹轰掉了2架飞机
坦克–》可以抽象成 类
炮弹–》可以抽象成类
飞机-》可以抽象成类
<2> 小明在公车上牵着一条叼着热狗的狗
小明–》 人类
公车–》 交通工具类
热狗–》 食物类
狗–》 狗类
定义一个类
简单Demo:
class Cat:
#属性
#方法,定义方法时,必须写上self
def eat(self):
print("猫在吃鱼----")
def drink(self):
print("猫在喝可乐----")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
#创建一个对象
tom = Cat()
#给tom指向的对象添加2个属性
tom.name ="汤姆"
tom.age=40
#调用tom指向的对象中的方法
tom.eat()
tom.drink()
tom.introduce()
#获取属性的第一种方式
#print("%s的年龄是%d"%(tom.name,tom.age))
lanmao=Cat()
lanmao.name="蓝猫"
lanmao.age=40
lanmao.introduce()
self指向调用的变量,谁调用,self指向谁
所谓的self,可以理解为自己
可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
__init__方法 (两个下划线)
init()方法,在创建一个对象时默认被调用,不需要手动调用
init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
class Cat:
"""定义了一个Cat类"""
#初始化对象
def __init__(self,new_name,new_age):
self.name=new_name
self.age=new_age
#方法,定义方法时,必须写上self
def eat(self):
print("猫在吃鱼----")
def drink(self):
print("猫在喝可乐----")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
#创建一个对象
tom = Cat("汤姆",40)
#调用tom指向的对象中的方法
tom.eat()
tom.drink()
tom.introduce()
lanmao=Cat("蓝猫",40)
lanmao.introduce()
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
class Cat:
"""定义了一个Cat类"""
#初始化对象
def __init__(self,new_name,new_age):
self.name=new_name
self.age=new_age
def __str__(self):
return "%s的年龄是:%d"%(self.name,self.age)
#方法,定义方法时,必须写上self
def eat(self):
print("猫在吃鱼----")
def drink(self):
print("猫在喝可乐----")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
#创建一个对象
tom = Cat("汤姆",40)
lanmao=Cat("蓝猫",40)
print(tom)
print(lanmao)
汤姆的年龄是:40
蓝猫的年龄是:40
应用一:烤地瓜
class SweetPotato:
def __init__(self):
self.cookedString = "生的"
self.cookedLevel = 0
self.condiments=[]
def __str__(self):
return "地瓜状态:%s(%d),添加的作料有%s"%(self.cookedString,self.cookedLevel,str(self.condiments))
def cook(self,cooked_time):
self.cookedLevel+=cooked_time
if self.cookedLevel>=0 and self.cookedLevel<3:
self.cookedString="生的"
elif self.cookedLevel>=3 and self.cookedLevel<5:
self.cookedString="半生不熟"
elif self.cookedLevel>=5 and self.cookedLevel<8:
self.cookedString="熟了"
elif self.cookedLevel>8:
self.cookedString="烤糊了"
def addCondiments(self,item):
self.condiments.append(item)
digua=SweetPotato()
print(digua)
#开始烤地瓜
digua.cook(1)
print(digua)
digua.addCondiments("大蒜")
digua.cook(1)
print(digua)
digua.cook(1)
digua.addCondiments("番茄酱")
print(digua)
digua.addCondiments("孜然")
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
应用二:存放家具
class Home:
def __init__(self,new_area,new_info,new_addr):
self.area=new_area
self.info=new_info
self.addr=new_addr
self.left_area=new_area
self.contains=[]
def __str__(self):
msg ="房子的总面积是%d,可用面积是%d,户型是%s,地址是%s"%(self.area,self.left_area,self.info,self.addr)
msg += "当前房子里的物品有%s"%(str(self.contains))
return msg
def add_item(self,item):
self.left_area -= item.area
self.contains.append(item.name)
class Bed:
def __init__(self,new_name,new_area):
self.name=new_name
self.area=new_area
def __str__(self):
return "%s占用的面积是%d"%(self.name,self.area)
fangzi=Home(129,"三室一厅","北京市 朝阳区 长安街 666号")
print(fangzi)
bed1=Bed("席梦思",4)
print(bed1)
fangzi.add_item(bed1)
print(fangzi)
bed2=Bed("三人床",6)
fangzi.add_item(bed2)
print(fangzi)
如果一个对象与另外一个对象有一定的关系,那么一个对象可用是另外一个对象的属性
应用二改进
class Home:
def __init__(self,new_area,new_info,new_addr):
self.area=new_area
self.info=new_info
self.addr=new_addr
self.left_area=new_area
self.contains=[]
def __str__(self):
msg ="房子的总面积是%d,可用面积是%d,户型是%s,地址是%s"%(self.area,self.left_area,self.info,self.addr)
msg += "当前房子里的物品有%s"%(str(self.contains))
return msg
def add_item(self,item):
# self.left_area -= item.area
# self.contains.append(item.name)
self.left_area -= item.get_area()
self.contains.append(item.get_name())
class Bed:
def __init__(self,new_name,new_area):
self.name=new_name
self.area=new_area
def __str__(self):
return "%s占用的面积是%d"%(self.name,self.area)
def get_area(self):
return self.area
def get_name(self):
return self.name
fangzi=Home(129,"三室一厅","北京市 朝阳区 长安街 666号")
print(fangzi)
bed1=Bed("席梦思",4)
print(bed1)
fangzi.add_item(bed1)
print(fangzi)
bed2=Bed("三人床",6)
fangzi.add_item(bed2)
print(fangzi)