Python面向对象的三大特性―封装,继承,多态

匿名 (未验证) 提交于 2019-12-02 22:56:40

面向对象的三大特性

封装是面向对象的一大特点,将属性和方法封装到一个类中。外界使用类创建对象,然后用对象调用方法

 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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!