封装
封装是从业务逻辑中抽象对象时,要赋予对象相关数据与操作,将一些数据和操作打包在一起的 过程。封装是使用对象的主要魅力之一,它提供了一个简单方法来创建复杂方案,解决了世界是如何工作的这一问题,我们自然的认为周围的世界是由相互作用的对 象组成,每个对象都有自己相关的数据,并能完成一定的功能,从设计的角度来看,封装还提供了一个重要的服务,它分开了是什么和怎么做这两个问题。对象的实 现与使用是相互独立的,封装的另外一个优势是支持代码复用,它可以将常用功能以组件方式打包起来。
举例01:
# XX 爱跑步
# 当跑步时体重减0.5
# 当吃饭时体重增加1
class Person(object):
def __init__(self,name,weight):
self.weight = weight
self.name = name
print '%s爱跑步' % self.name
def run(self):
self.weight -= 0.5
print '%.2f' % self.weight
def eat(self):
self.weight += 1.0
print '%.2f' % self.weight
name1 = Person('guodong',90)
#name1.run()
name1.eat()
name2 = Person('xubowen',45)
name2.run()
#name2.eat()
运行结果:
举例02:
##摆放家具
# 需求
# 1房子有户型,总面积和家具名称列表
新房子没有任何家具
# 2家具有名字和占地面积,其中
床:占4平米
衣柜:占2平米
餐桌:占1.5平米
# 3将以上三间家具添加到房子中
# 4打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
class Jiaju():
pass
# 初始化方法
def __init__(self,name,area):
self.name = name
self.area = area
def __str__(self):
return '[%s] 的占地面积为 %.2f' % (self.name,self.area)
# 添加家具
bed = Jiaju('bed',4)
print bed
chest = Jiaju('chest',2)
print chest
table = Jiaju('table',1.5)
print table
class House():
def __init__(self,type,area):
self.type = type
self.area = area
self.free_area = area
#定义家具列表
self.item_list = []
def __str__(self):
return ('户型: %s\n 总面积: %.2f\n 剩余面积: %.2f\n 家具: %s'
% (self.type,self.area,self.free_area,self.item_list))
def add_item(self,item):
# 判断房间是否可以摆下家具
if item.area > self.free_area:
print '%s占地面积过大,无法放入' % item.name
return
else:
self.item_list.append(item.name)
self.free_area -= item.area
print '添加 %s' % item
myhome = House('两室一厅',100)
myhome.add_item(bed)
myhome.add_item(chest)
myhome.add_item(table)
print myhome
运行结果:
举例03-士兵开火:
class Gun():
def __init__(self,model):
self.model = model
self.bullet_count = 0
def __str__(self):
return '士兵枪的型号是 %s' % (self.model)
def add_bullet(self,count):
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print '%s 没有子弹了' % self.model
return
else:
self.bullet_count -= 1
print '%s 突突突 %d' % (self.model,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
else:
print 'go !!! %s' % self.name
self.gun.add_bullet(50)
self.gun.shoot()
ak47 = Gun('AK47')
ak47.add_bullet(50)
ak47.shoot()
ryan = Soldier('Ryan')
ryan.gun = ak47
print ryan.gun
print ryan
运行结果:
继承
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、Super class)
举例01:
class Animal():
def eat(self):
print '吃'
def drink(self):
print '喝'
def run(self):
print '跑'
def sleep(self):
print '睡'
class Cat(Animal):
def call(self):
print 'miomio~'
class Hellokitty(Cat):
def speak(self):
print '我会说日语'
ly = Hellokitty()
ly.call()
ly.drink()
ly.eat()
ly.run()
ly.sleep()
ly.speak()
运行结果:
举例02-多继承:
# 多继承:
# 子类可以继承父类的属性和方法叫做单继承
# 子类可以继承多个父类的属性和方法叫多继承
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 方法'
# A B那个在前面调用那个
class C(B,A):
# 多继承可以让子类同时具有多个父类的属性和方法
pass
c = C()
c.test()
c.demo()
运行结果:
多态
多态意味着多种形式,当用面向对象时,它是指对象是怎么回应一个依赖于对象类型或种类的消息。多态的作用是让程序在不同情况下用一个函数名启用不同的方法。不同的子类,对象调用相同的方法,产生不同的执行结果
举例01:
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print '%s 蹦蹦跳跳的玩' % self.name
class Xiaotianquan(Dog):
def __init__(self,name):
self.name = name
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()
# 调用的Xiaotianquan类,将执行这个类中的game方法
wangcai = Xiaotianquan('旺财')
xiaoming = Person('小明')
xiaoming.game_with_dog(wangcai)
运行结果:
举例02:
class Car(object):
def __init__(self,name):
self.name = name
def Func(self):
print '%s 可以在路上开' % self.name
class Bianxingjingang(Car):
def __init__(self,name):
self.name = name
def Func(self):
print '%s 可以变成机器人' % self.name
class Person(object):
def __init__(self,name):
self.name = name
def Use_Car(self,car):
print '%s 可以驾驶 %s' % (self.name,car.name)
car.Func()
dahuangfeng = Bianxingjingang('大黄蜂')
guodong = Person('郭栋')
guodong.Use_Car(dahuangfeng)
运行结果: