'''

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 = nameself.weight = weightdef eat(self):      #吃self.weight += 1def run(self):        #跑self.weight -= 0.5def __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 = nameself.area = areadef __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_typeself.total_area = total_areaself.free_area = total_areaself.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 = nameself.zidan = 0def add_zidan(self,count):     #填装子弹self.zidan += countdef  shoot(self):          #射击if self.zidan > 0:self.zidan -= 1print('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 = nameself.gun = Nonedef 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 = nameclass KOBE(Person):def __init__(self, age):super(KOBE, self).__init__('科比')  #要将子类KOBE和self传递进去self.age = agekobe = 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

三大特征 封装 继承 多态相关推荐

  1. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  2. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  3. OC面向对象的三大特征(封装 继承 多态)习题2 复合

    复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...

  4. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  5. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  6. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  7. 面向对象的四大特征 封装 继承 多态 抽象

    1.封装 广义: 类 方法 包 的定义本身就是一种封装 狭义: 在设计一个类的时候 将所有的属性设置为私有的 并对各个私有的属性设计相应的 存/取方法 来完成对属性的使用 私有化只能代表封装的特性 可 ...

  8. c++局部对象是什么_面向对象三大特征: 封装

    今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...

  9. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

最新文章

  1. 云时代运维转型必读:容器运维模式的五大场景
  2. 鸿蒙2.0 安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  3. gdb调试fork+exec创建的子进程的方法
  4. MAVEN学习笔记-maven的获取和安装
  5. 用于显示本地通知的跨平台插件flutter_local_notifications
  6. 如何将RTC中基于AI的音频算法有效的产品化
  7. SpringBoot与安全
  8. 关于IE的RegExp.exec
  9. 几个公共FTP服务器
  10. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——A题 切蛋糕
  11. Android的TextView部分文字点击切换颜色(ClickableSpan)
  12. Ceph Monitor基础架构与模块详解
  13. 16. Window close() 方法
  14. Mysql复合索引的顺序和必要值
  15. 命令行 - 很好的工具,很强大
  16. 戏说CAD开发 最简单角度看CAD软件
  17. 谈谈MySQL如何选择float, double, decimal
  18. eclipse中jsp页面图片不显示问题
  19. 微信王者抢先服是什么服务器,王者荣耀抢先服是什么?王者荣耀抢先服介绍
  20. 计算机系统要素-从零开始构建现代计算机-答案

热门文章

  1. python 贪婪 非贪婪 匹配
  2. 空气撑起2万亿市值?币圈十大地雷被视而不见
  3. kaggle notebook里面如何使用一个完整的项目和py脚本
  4. java MD5加密的两种方法总结
  5. flink sql 异常:INTEGER and VARCHAR(2147483647) does not have common type no
  6. (C语言)石头剪刀布
  7. unbound支持ecs版本安装,配置
  8. 小游戏——斗破苍穹——pow_na的博客
  9. 在线JSON转PlainText工具
  10. JAVA计算机毕业设计基于web的面向公众的食品安全知识系统源码+数据库+系统+lw文档