博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三大特征 封装 继承 多态
阅读量:4983 次
发布时间:2019-06-12

本文共 7188 字,大约阅读时间需要 23 分钟。

'''

1、面向对象与面向过程

    面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么
    基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式
    优点:复杂的过程流程化
    缺点:扩展性差
 
    面向对象:核心是对象二字,对象指特征与技能的结合体
    基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种‘上帝式’的思维方式
    优点:可扩展性强
    缺点:变成复杂度高,极容易出现过度设计的问题
 

2、类

    对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
    在现实生活中:一定是先有一个个具体的对象,后总结出类
    在程序中:一定是先定义类,后产生对象
 
'''
# class Students:#     school = '中心小学'#     def __init__(self,name, age, job):#         self.name = name#         self.age = age#         self.job = job#     def run(self):#         # return 'running......'#         print('running....')# stu1 = Students('张三', 18, 'IT')# stu2 = Students('王二', 16, 'student')# stu3 = Students('赵五', 19, 'teacher')# stu1.run()

 

 

特征:

一、封装

  1.封装是面相对性一大特点
  2.面向对象编程的第一步--将属性和方法封装到一个抽象的类当中
  3.外界使用类创建对象,然后让对象调用方法
  4.对象方法的细节都被封装在类的内部
 

题目1:

 1.小明体重75公斤
 2.小明每次跑步都会减肥0.5公斤
 3.小明每次吃东西体重会增加1公斤
 
class Person(object):     def __init__(self, name, weight):         self.name = name         self.weight = weight      def eat(self):      #吃         self.weight += 1     def run(self):        #跑         self.weight -= 0.5      def __str__(self):         return '姓名:%s\n体重:%s公斤\n' % (self.name, self.weight) xiaoming = Person('小明', 90)    #  创建小明xiaoming.eat()                   #让小明调用吃的方法xiaoming.run()                     #让小明调用跑的方法print(xiaoming)

 

 题目2:   

   1、房子有户型、总面积、家具名称列表
    房子没有任何家具
 2、家具有名字和占地面积,其中
    席梦思(bed):4平米
    衣柜(chest): 2平米
    餐桌(table): 1.5平米
 3、将以上3个家具添加到房子中
 4、打印房子中,要求输出:户型、总面积、剩余面积、家具名称列表
 
class Items(object):#创建一个家具类    def __init__(self, name, area): #初始化出不同的类对象        self.name = name        self.area = area      def __str__(self):         return '家具名称:%s\n面积:%s平米\n' % (self.name, self.area) class House(object):#创建房子类     def __init__(self, house_type, total_area):#初始化房子类(因为新房子没有家具,剩余面积等于总面积,所以不用传参)         self.house_type = house_type         self.total_area = total_area         self.free_area = total_area         self.items = []      def add_item(self, item):#添加家具的技能         self.items.append(item.name)#一触发添加家具的技能就添加家具到列表中         if self.free_area > item.area:#假如剩余面积大于家具面积就添加成功             self.free_area = self.free_area - item.area            # print('户型:%s\n总面积:%s平米\n剩余面积:%s平米\n家具列表:%s\n' % (self.house_type, self.total_area, self.free_area, self.items))         else:#否则添加不进去             print('家具太大了,装不进去....')      def __str__(self):#打印房子当前状态         return '户型:%s\n总面积:%s平米\n剩余面积:%s平米\n家具列表:%s\n' % \               (self.house_type, self.total_area,self.free_area, self.items)bed = Items('席梦思',4)#实例化出一个床对象chest = Items('衣柜', 2)#实例化出一个衣柜对象table = Items('餐桌', 1.5)#实例化出一个餐桌对象# fire_car = Items('火车', 100)  house = House('两室一厅', 90)       #实例化出一个房子对象house.add_item(bed)               #执行添加家具动作house.add_item(chest)house.add_item(table)house.add_item(fire_car)print(house)

 

题目3:

1、士兵  狗蛋 有一把M4A1
2、士兵 可以 开火
3、枪 能 发射 子弹
4、枪 装填 子弹 --增加子弹数量
class Gun(object):       #抢    def __init__(self,name):        self.name = name        self.zidan = 0    def add_zidan(self,count):     #填装子弹        self.zidan += count    def  shoot(self):          #射击        if self.zidan > 0:            self.zidan -= 1            print('fire.....%s' %self.zidan)        else:            print(' no zidan ')    def __str__(self):        return ' 有一把%s\n子弹为%s'%(self.name,self.zidan) class per(object):                 #人    def __init__(self,name):        self.name = name        self.gun = None    def fire(self):             #开火        if self.gun:            self.gun.shoot()        else:            print('meiyou gun')M4A1 = Gun('M4A1')       #创建枪gd = per('狗蛋')       #创建狗蛋gd.gun = M4A1    #狗蛋--调用了--抢  (也就是给狗蛋安排枪)gd.gun.add_zidan(50)  #狗蛋的--枪--添加子弹gd.fire()     #狗蛋开火gd.fire()

二、继承

    
继承实现代码的重用,相同的代码不需要重复的编写
 
动物:吃、喝、跑、睡
狗:除了(吃、喝、跑、睡) 还会(叫)
哮天犬:除了(吃、喝、跑、睡、叫) 还会(飞)
# class Anamal(object):# #     def eat(self):# #         print('吃')# #     def drink(self):# #         print('喝')# #     def run(self):# #         print('跑')# #     def sleep(self):# #         print('睡')# ## # class Dog():# #     def bark(self):# #         print('汪汪叫')# ## # class XiaoTianQuan(Anamal,Dog):# #     def fly(self):# #         print('我会飞啦!!!!')# ## # dog = XiaoTianQuan()# # dog.bark()# # dog.run()# # dog.eat()# # dog.sleep()# # dog.drink()# # dog.fly()

 

2、方法的重写

1)子类拥有父类的所有方法和属性
2)子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发应用场景
3)当父类的方法实现不能满足子类需求时,可以对方法进行重写
 
class Anamal(object):     def eat(self):         print('吃')     def drink(self):         print('喝')     def run(self):         print('跑')     def sleep(self):         print('睡') class Dog(Anamal):     def bark(self):                     print('汪汪叫') class XiaoTianQuan(Dog):     def fly(self):         print('我会飞啦!!!!')     def bark(self):         print('有仙气的叫.......') dog = XiaoTianQuan()dog.eat()dog.run()dog.sleep()dog.drink()dog.bark()    #重写dog.fly()
 
对父类的方法进行扩展
  1.在子类中重写父类的方法
  2.在需要的位置使用super().父类方法来调用父类方法的执行
  3.代码其他的位置针对子类的需求,编写子类特有的代码实
关于super
  在python中super是一个特殊的类
  super()就是使用super类创建出来的对象
  最常使用的场景就是在重写父类方法时,调用在父类中封装的方法实现
class Anamal(object):    def eat(self):         print('吃')     def drink(self):         print('喝')     def run(self):         print('跑')     def sleep(self):         print('睡')class Dog(Anamal):     def bark(self):                 print('汪汪叫')class XiaoTianQuan(Dog):     def fly(self):         print('我会飞啦!!!!')      def bark(self):         print('牛逼的叫.......')         super().bark()       #调用基类的方法         print('%*#*@^$*(@')dog = XiaoTianQuan()dog.eat()dog.run()dog.sleep()dog.drink()dog.bark()dog.fly() 初始化__init__继承class Person():     def __init__(self, name):         self.name = name class KOBE(Person):     def __init__(self, age):         super(KOBE, self).__init__('科比')  #要将子类KOBE和self传递进去         self.age = age kobe = KOBE(18)print(kobe.name)print(kobe.age)

三、多态

  面向对象的三大特性:
  1.封装根据职责将属性和方法封装到一个抽象的类中
    • 定义类的准则
  2.继承实现代码的重用,相同的代码不需要重复的编写
    • 设计类的技巧
    • 子类针对自己特有的需求,编写特定的代码
  3.多态不同的子类对象调用相同的父类方法,产生不同的执行结果
    1.多态可以增加代码的灵活度
    2.以继承和重写父类方法为前提
    3.是调用方法的技巧,不会影响到类的内部设计
# class Dog(object):#     def __init__(self, name):#         self.name = name#     def game(self):#         print('%s 开开心心去玩耍.....' % self.name) # class XiaoTianQuan(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()## xiaoming = Person('小明')     #创建人对象# dog = Dog('旺财')       #创建狗对象# xiaoming.game_with_dog(dog)   #让小明跟狗玩耍# xtq = XiaoTianQuan('飞天旺财')# xiaoming.game_with_dog(xtq)

类方法

# class Tool(object):#     count = 0#     @classmethod#     def show_tools_count(cls):#         print('当前工具数量为%s' % cls.count)#     def __init__(self, name1, name2):#         self.name1 = name1#         self.name2 = name2#         Tool.count += 2# tool1 = Tool('锤子')# tool2 = Tool('榔头')# Tool.show_tools_count()'';lkiy.

 静态方法:

        既不需要访问实例属性或者调用实例方法
        也不需要访问类属性或者调用类方法
        这个时候我们可以考虑把这个方法封装成静态方法
 
# class Dog(object):#     @staticmethod#     def run():#     #不访问实例属性,也不访问类属性#         print('小狗要跑.....')#     def jump(self):#         print('小狗要跳.....')# # Dog.run()# # Dog.jump()# xiaotianquan = Dog()# Dog.run()# # Dog.jump('xiaotianquan')# xiaotianquan.jump()

 

 
 
 
 

转载于:https://www.cnblogs.com/heiguu/p/10098193.html

你可能感兴趣的文章
(坑集)Django环境配置
查看>>
利用padding-top/padding-bottom百分比,进行占位和高度自适应
查看>>
常用的监控系统资源的工具
查看>>
08ssm三大框架整合以前步骤
查看>>
R语言学习笔记之八
查看>>
正则表达式语法(msdn)
查看>>
MySQL 数据类型 详解 (转载)
查看>>
Maven学习笔记(一)
查看>>
分割线
查看>>
xls的读写
查看>>
用函数创建子进程
查看>>
Myeclipse配置插件
查看>>
gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
查看>>
蓝桥杯之入学考试
查看>>
新公司java的注解以及springboot的相关注解
查看>>
Unity脚本的生命周期中几个重要的方法
查看>>
poj1552
查看>>
Thinkphp中文水印和图片水印合体集成插件
查看>>
FLASK安装--兼收EZ_INSTALL及PIP
查看>>
C++静态成员变量和静态成员函数小结
查看>>