面向对象:
面向对象和面向过程的区别:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程最大的问题(也许是唯一先天的缺陷)在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃
面向对象的提出正是试图解决这一软件危机
面向对象三大特性:
1.封装:根据职责将属性和方法封装到一个抽象的类中定义类的准则
2.继承:实现代码的重用,相同的代码不需要重复的编写设计类的技巧
子类针对自己特有的需求,编写特定的代码
3.多态:
不同的子类(这是之前提到的继承的知识)
对象调用相同的方法,产生不同的执行结果
类的设计:
在程序中,要设计一个类,通常需要满足以下三个需求:
1.类名 这类事物的名字,满足大驼峰命名法
2.属性 这类事物具有什么样的特征
3.方法 这类事物具有什么样的行为
面向对象的基础语法:
定义简单的类:
定义只包含方法的类:
class 类名:
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量 = 类名( )
需求:
小猫爱吃鱼,小猫爱喝水
class Cat():
# 哪一个对象调用的方法,self就是哪一个对象的引用
def eat(self):
print '%s like eating fish' % self.name
def drink(self):
print '小猫爱喝水'
# 创建猫对象
dudu = Cat()
dudu.name = 'dudu' #给猫一个名字
dudu.eat()
dudu.drink()
print dudu
addr = id(dudu)
# %x:打印格式为十六进制的内存地址
print '%x' % addr
# %x:打印格式为十进制的内存地址
print '%d' % addr
# 再创建一个猫对象(内存地址与dudu的不同)
lazy_cat = Cat()
lazy_cat.name = 'bobo'
lazy_cat.eat()
lazy_cat.drink()
print lazy_cat
lazy_cat2 = lazy_cat
print lazy_cat2 #内存地址与lazy_cat相同
初始化方法:
我们现在已经知道了使用 类名() 就可以创建一个对象
当使用类名()创建对象时,python的解释器就会自动执行以下操作:
1.为对象在内存中分配空间--创建对象
2.调用初始化方法为对象的属性设置初始值--初始化方法(__init__)
这个初始化方法就是__init__方法,__init__时对象的内置方法
__init__方法是专门用来定义一个类具有那些属性的方法
class Cat():
def __init__(self):
print '这是一个初始化方法'
# self.属性名 = 属性的初始值
self.name = 'dudu'
# 使用 类名() 创建对象的时候,会自动调用初始化方法_init_
dudu = Cat()
print dudu.name
class Cat():
def __init__(self,new_name):
self.name = new_name
# 在类中,任何方法都可以使用self.name
def eat(self):
print '%s like eating fish' % self.name
dudu = Cat('dudu')
print dudu.name
dudu.eat()
lazy_cat = Cat ('lazy_cat')
lazy_cat.eat()
封装:
1.封装是面向对象编程的一大特点
2.面向对象编程的第一步 将属性和方法封装到一个抽象的类中
3.外界使用类创建对象,然后让对象调用方法
4.对象方法的细节都被封装在类的内部
需求:
1.xx爱跑步
2.xx体重50公斤
3.xx每次跑步会减肥0.5公斤
4.xx每次吃东西体重会增加1公斤
class Person():
def __init__(self,new_name,weight):
self.name = new_name
self.weight = weight
def __str__(self):
return '我的名字叫%s 体重是%.2f' % (self.name,self.weight)
def run(self):
print '%s 爱跑步' % self.name
self.weight -= 0.5
def eat(self):
print '%s 吃东西' % self.name
self.weight += 1
name = Person('dmf',52.0)
#name.run()
name.eat()
print name
需求:(多人)
1.xx和xxx都爱跑步
2.xxx体重45公斤
3.xx体重50公斤
4.xx每次跑步会减肥0.5公斤
5.xx每次吃东西体重会增加1公斤
class Person():
def __init__(self,new_name,weight):
self.name = new_name
self.weight = weight
def __str__(self):
return '我的名字叫%s 体重是%.2f' % (self.name,self.weight)
def run(self):
print '%s 爱跑步' % self.name
self.weight -= 0.5
def eat(self):
print '%s 吃东西' % self.name
self.weight += 1
name = Person('dmf',52.0)
#name.run()
name.eat()
print name
name = Person('amy',60.0)
#name.run()
name.eat()
print name
需求:
1.房子有户型,总面积和家具名称列表
新房子没有任何家具
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平米
餐桌:占2平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
class Furniture():
# 初始化方法
def __init__(self,name,area):
self.name = name
self.area = area
def __str__(self):
return '[%s] 占地%.2f' %(self.name,self.area)
class House():
def __init__(self,house_type,area):
self.house_type = house_type
self.area = area
#剩余面积
self.free_area = area
#家具名称列表
self.item_list = []
def __str__