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

面向对象的三大特性

一.封装

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

 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)

猜你喜欢

转载自blog.csdn.net/jay_youth/article/details/81158277