面向对象的三大特性
一.封装
封装是面向对象的一大特点,将属性和方法封装到一个类中。外界使用类创建对象,然后用对象调用方法
class person():
def __init__(self, name, weight): # 初始化方法
self.name = name
self.weight = weight
def decrease(self): # 定义减肥方法
self.weight -= 0.5
print '每次跑步会减重0.5公斤!'
def increase(self): #定义增肥方法
self.weight += 1.0
print '每次吃东西会增重1.0公斤!'
def __str__(self): # 定义str方法
return '我的名字叫%s,我的体重是%.2f' % (self.name, self.weight)
jay = person('jay', 70) # 利用person类创建对象
jay.decrease() # 调用jay的方法
jay.increase()
print jay
lily = person('lily',45) # 同样利用person创建对象,一个类可以创建多个对象
lily.decrease() # 调用lily的方法
print lily
举例1:
需求:房间和家具:
1.房子有户型,总面积和家具名称列表,新房间无家具
2.家具有名称和占地面积
3.将家具添加到房间中
# 定义家具类
class furn():
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return '%s的占地面积是%.1f' % (self.name, self.area)
# 定义房子类
class home():
def __init__(self, type, area):
self.type = type
self.area = area
# 定义剩余面积
self.free_area = area
self.furn_list = []
def __str__(self):
return '户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s' \
% (self.type, self.area, self.free_area, self.furn_list)
def add_furn(self, furn):
print '要添加%s' % furn.name
if furn.area > self.free_area:
print '%s 的面积太大,无法添加' % furn.name
return
self.furn_list.append(furn.name)
self.free_area -= furn.area
# 创建家具
bed = furn('bed', 4)
print bed
chest = furn('chest', 400)
print chest
table = furn('table', 1.5)
print table
# 创建房子
my_home = home('两室一厅', 200)
my_home.add_furn(bed)
my_home.add_furn(chest)
my_home.add_furn(table)
print my_home
举例2:
需求:士兵拥有枪,当枪内有子弹时才可以射击
# 创建枪类
class Gun():
def __init__(self, model):
self.modle = model
self.bullet_count = 0
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print '%没有子弹了' % self.modle
return
self.bullet_count -= 1
print '发射一枚子弹!还剩余%s' % self.bullet_count
# 创建士兵类
class Soldier():
def __init__(self, name):
self.name = name
self.gun = None
def fire(self):
if self.gun == None:
print '%s还没有枪。。' % self.name
return
print 'go go go!%s' % self.name
self.gun.add_bullet(10)
self.gun.shoot()
# 定义枪对象
ak47 = Gun('AK47')
# ak47.add_bullet(10)
# ak47.shoot()
# 定义士兵对象
ryan = Soldier('Ryan')
ryan.gun = ak47
ryan.fire()
print ryan.gun
二.继承
继承是实现代码的重用,相同部分代码不需要重复写,分为单继承和多继承
1.单继承:
class small():
def math(self):
print '我有数学课!'
def chinese(self):
print '我有语文课!'
def english(self):
print '我有英语课!'
# middle继承small的所有属性和方法
# middle成为子类,small成为父类
class middle(small):
def physics(self):
print '我有物理课!'
# big类继承父类和祖父类的所有属性和方法
class big(middle):
def computer(self):
print '我有计算机课!'
jay = big()
jay.chinese() # 在big类内未定义以下方法,但是却可以直接调用,因为big继承了small和middle
jay.math()
jay.english()
jay.physics()
jay.computer()
2.多继承
多继承:子类拥有多个父类叫多继承,拥有所有父类的属性和方法
class 子类名(父类名1,父类名2...)
pass
class A():
def test(self):
print 'A-----test'
def demo(self):
print 'A-----demo'
class B():
def test(self):
print 'B-----test'
def demo(self):
print 'B-----demo'
class C(B,A):
# 当父类的方法或属性同名时,按括号中的父类的先后顺序继承
pass
c = C()
c.demo()
c.test()
3.继承中的重写问题
重写父类:如果在开发过程中,父类的方法的实现和子类方法的实现完全不同
就可以使用覆盖的方法在子类中重新编写父类中的方法
class small():
def math(self):
print '我有数学课!'
def chinese(self):
print '我有语文课!'
def english(self):
print '我有英语课!'
# middle继承small的所有属性和方法
# middle成为子类,small成为父类
class middle(small):
def physics(self):
print '我有物理课!'
# big类继承父类和祖父类的所有属性和方法
class big(middle):
def english(self): # 和small中的english方法重名,即重写
print '我有英文赏析课!'
jay = big()
jay.english()
4.继承中的扩展问题
如果在开发过程中,子类的方法实现包含父类的方法实现(父类原本封装的方法实现是子类方法的一部分,就可以使用扩展方法)
扩展的方法:在需要位置使用父类名.方法(self)来调用父类方法的执行,代码其他位置针对子类的需求,编写子类特有的代码实现
class small():
def math(self):
print '我有数学课!'
def chinese(self):
print '我有语文课!'
def english(self):
print '我有英语课!'
# middle继承small的所有属性和方法
# middle成为子类,small成为父类
class middle(small):
def physics(self):
print '我有物理课!'
# big类继承父类和祖父类的所有属性和方法
class big(middle):
def computer(self):
print '我有计算机课'
jay.english()
jay = big()
jay.computer()
3.多态
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print '%s是一只普通的狗!' % self.name
class amazing(Dog):
def game(self):
print '%s是一只神奇的狗!' % self.name
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print '%s 和 %s 快乐地玩!' % (self.name, dog.name)
dog.game()
wangcai = amazing('旺财')
#wangcai = dog('旺财') # 如果利用dog类生成这个对象,调用同样的方法,产生不同的结果
xiaoming = Person('小明')
xiaoming.game_with_dog(wangcai)