面向对象的三大特性
封装是面向对象的一大特点,将属性和方法封装到一个类中。外界使用类创建对象,然后用对象调用方法
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()
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
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)
文章来源: Python面向对象的三大特性―封装,继承,多态