面向对象概念及三大特点
面向对象:
面向对象的基本概念
面向对象 oop : object oriented programming
我们之前学习的编程方式就是面向过程的
面向过程和面向对象,是两种不同的编程方式
对比面向过程的特点,可以更好的了解什么是面向对象
过程和函数(都是对一段功能的代码进行封装)
过程:是早期的一个编程概念
过程类似于函数,只能执行,但是没有返回值
函数:不仅能执行,还可以返回结果(return)
面向过程 和 面向对象 的基本概念
1、面向过程:---侧重于怎么做?
1.把完成某一个需求的 所有步骤 从头到尾 逐步实现
2.根据开发要求,将某些功能独立的代码封装成一个又一个函数
3.最后完成的代码,就是顺序的调用不同的函数
特点:
1.注重步骤与过程,不注重职责分工
2.如果需求复杂,代码会变得很复杂
3.开发复杂项目,没有固定的套路,开发难度很大
面向对象:--谁来做?
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
1.在完成某一个需求前,首先确定职责--要做的事(方法)
2.根据职责确定不同的对象,在对象内部封装不同的方法(多个)即我们所说的函数。
3.最后完成代码,就是顺序的让不同的对象调用不同的方法
特点:
1.注重对象和职责,不同的对象承担不同的职责
2.更加适合对复杂的需求变化,是专门应对复杂项目的开发,提供的固定套路
3.需要在面向过程的基础上,再学习一些面向对象的语法
熟悉面向对象编程
python java c++
类:是对一群具有相同特征或行为的事物的一个统称,不能直接使用(比如:飞机制造图纸不能飞上天)
特征:属性
行为:方法
对象:由类创建出来的一个具体的存在,可以直接使用(用图纸制造出来的飞机可以飞上天)
注意!!! 在程序开发中:应该先有类 再有对象
类的设计
1.类名: 这类事物的名字,满足大驼峰命名法
大驼峰命名法
每一个单词的首字母大写
单词与单词只见没有下划线
2.属性: 这个类创建出的对象有什么样的特征
3.方法: 这个类创建出的对象有什么样的行为
注意!!!面向对象的三大特点:
1.封装:根据职责将属性和方法封装到一个抽象的类中
2.继承:实现代码的重用,相同的代码不需要重复的写
3.多态:(以封装和继承为前提),不同的子类对象调用相同的方法,产生不同的执行结果
封装
1.封装是面向对象编程的一大特点
2.面向对象编程的第一步 将属性和方法封装到一个抽象的类中(为什么说是抽象的,因为类不能直接使用)
3.外界使用类创建对象,然后让对象调用方法
4.对象方法的细节都被封装在类的内部
例1、
#定义一个Person类
class Person:def __init__(self, name, weight):# 初始化方法中增加两个参数由外界传递# self.属性 = 形参self.name = nameself.weight = weightdef __str__(self):# 输出一段字符串return '我的名字叫 %s 体重是 %.2f' % (self.name, self.weight)def run(self):print '%s 爱跑步' % self.name# 在对象方法的内部,是可以直接访问对象的属性self.weight -= 0.5def eat(self):print '%s 吃东西' % self.nameself.weight += 1xx = Person('小明', 75.0)
xx.run()
xx.eat()
print xx# 同一个类创建出来的多个对象之间,属性互补干扰
xm = Person('小丽', 45.0)
xm.run()
xm.eat()
print xm
print xx
例2:摆放家具
要求:
1.房子有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具有名字和占地面积,其中
床:占4平米
衣柜:占2平面
餐桌:占1.5平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
class HouseItem:# 初始化方法def __init__(self, name, area):self.name = nameself.area = areadef __str__(self):return '[%s] 占地 %.2f' % (self.name, self.area)"""
家具名称列表 []
"""class House:def __init__(self, house_type, area):# 需要从外界传递进来的参数self.house_type = house_typeself.area = area# 剩余面积(新房子没有任何家具,剩余面积=总面积)self.free_area = area# 家具名称列表self.item_list = []def __str__(self):return '户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s' \% (self.house_type, self.area, self.free_area, self.item_list)def add_item(self, item):print '要添加 %s' % item"""1.判断家具的面积是否超过房子的面积,如果超过了,提示不能添加这个家具2.将家具的名称 追加到家具名称列表中去3.用房子的剩余面积 - 家具的面积"""if item.area > self.free_area:print '%s 的面积太大了,无法添加' % item.name# 如果不满足,下方的代码就不执行return# 将家具的名称添加到列表中self.item_list.append(item.name)# 计算剩余面积self.free_area -= item.area# 1.创建家具
bed = HouseItem('bed', 400)
print bed
chest = HouseItem('chest', 2)
print chest
table = HouseItem('table', 1.5)
print table# 2.创建房子对象
my_home = House('两室一厅', 400)
# 添加家具到房子里面去
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print my_home
注意:对于两个类等的使用且相互有使用和被使用的关系,则被使用的类应该先开发
继承
单继承
继承的概念:子类拥有父类的所有属性和方法,目的是实现代码的重用,相同的代码不需要重复的写。
继承的语法
class 类名(父类):
def 子类特有的方法
例1:
创建一个Animal类
class Animal(object):def eat(self):print '吃'def drink(self):print '喝'def run(self):print '跑'def sleep(self):print '睡'#创建一个Cat类(其中Cat类是Animal类的子类)
# 子类机车父类的所有属性和方法并且子类创建自己独特的属性方法
class Cat(Animal):def call(self):print '喵喵'lily = Cat()
lily.eat()
lily.drink()
lily.run()
lily.sleep()
lily.call()
总结:
子类继承自父类,可以直接享受父类中已经封装好的属性和方法
子类中应该根据自己的职责,封装子类特有的属性和方法
注意:
以上所说的继承,可以有以下两种说法,意思是一样的
说法1:Cat类是Animal类的子类,Animal类是Cat类的父类,Cat从Animal类继承
说法2:Cat类是Animal类的派生类,Animal类是Cat类的基类,Cat类从Animal类派生
应该注意:平级之间没有任何必然联系
例2:
class Animal(object):def eat(self):print '吃'def drink(self):print '喝'def run(self):print '跑'def sleep(self):print '睡'class Dog(Animal):def bark(self):print '旺旺'lucy = Dog()lucy.eat()lucy.drink()lucy.run()lucy.sleep()lucy.bark()class Muyang(Dog):def speak(self):print '我会保护羊'lily = Muyang()lily.eat()lily.drink()lily.run()lily.sleep()lily.bark()lily.speak()
总结:
继承的传递性,子类拥有父类的父类的属性和方法
继承的传递性:(爷爷 父亲 儿子)
1.Muyang类从Dog类继承,Dog类又从Animal类继承
2.那么Muyang类就具有Dog类和Animal类的所有属性和方法
子类Muyang拥有父类以及父类的父类中封装的所有属性和方法
例3:
重写父类方法 1:
1.覆盖父类的方法
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 '喵喵'class Hellokitty(Cat):def speak(self):print '我可以说中文'def call(self):# 针对子类特有的需求,编写代码,这种情况下子类重写了父类的方法print '你很调皮'kt = Hellokitty()
# 如果子类中,重写了父类的方法
# 在运行中,只会调用在子类中重写的父类的方法而不会调用父类的方法
kt.call()
例4:
重写父类方法2:
2.扩展父类的方法
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 '喵喵'class Hellokitty(Cat):def speak(self):print '我可以说中文'def call(self):# 针对子类特有的需求,编写代码print '你很调皮'# 调用原本在父类中封装的代码Cat.call(self)# 增加其他的子类代码print '@#¥Y%……&**&……%Y¥#@'kt = Hellokitty()
kt.call()
总结:
若重写了父类的方法,则调用的时候只调用子类而不调用父类;
但若子类在写的时候还调用了父类,则相当于父类的扩展,调用的时候子类重写的方法和父类已有的方法一起调用。
例5:
定义属性注意的事项:
class Bird:def __init__(self):self.hungry = True# 鸟吃过了以后就不饿了def eat(self):if self.hungry:print 'I am eating'self.hungry = Falseelse:print 'No thanks'class SongBird(Bird):def __init__(self):self.sound = 'Zd0ci!'#注意:Bird.__init__(self)def sing(self):print self.soundlittle_bird = SongBird()
little_bird.eat()
little_bird.sing()
例5:
多继承可以让子类对象,同时具有多个父类的属性和方法
class A(object):
def test(self):
print 'A-----test 方法'
def demo(self):
print 'A-----demo 方法'
class B(object):
def test(self):
print 'B------test 方法'
def demo(self):
print 'B-------demo方法'
class C(B, A):
"""多继承可以让子类对象,同时具有多个父类的属性和方法"""
pass
# 创建子类对象
c = C()
c.test()
c.demo()
若将上面的class C(B, A)换成class C(A, B)
则结果为:
多态:
(以封装和继承为前提),不同的子类对象调用相同的方法,产生不同的执行结果
例如:
定义一个类
人类
work(self):
创建两个子类
程序员 设计师
这两个子类调用了相同的方法
产生的结果如下:
class Dog(object):def __init__(self, name):self.name = namedef work(self):print '%s 正在工作' % self.nameclass xiaotiandog(Dog):# 父类方法不能满足子类的方法,重写game方法def game(self):# 在使用继承时,子类拥有父类的所有属性和方法print '%s 飞到天上玩...' % self.nameclass Person(object):def __init__(self, name):self.name = namedef game_with_dog(self, dog):print '%s 和 %s 快乐的玩耍' % (self.name, dog.name)# 让狗玩耍dog.game()# 1.创建一个狗对象
#wangcai = Dog('旺财')
wangcai = Xiaotiandog('旺财')
# 2.创建一个小明对象(小明是一个人)
xiaoming=Person('小明')
# 3.让小明调用和狗玩的方法(把之前创建的狗对象传递进去)
xiaoming.game_with_dog(wangcai)
"""
案例小结:
Person类中只需要让狗对象调用game方法(这是子类的父类中封装的方法),而不关心具体是什么狗game方法是在Dog父类中定义的
在程序执行时,传入不同的狗对象的实参,就会产生不同的执行效果
相关文章:
【Android】ViewPager实现无限循环滚动
最近做的一个项目,客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页,也就是实现无限循环滚动,效果如下: 看了下ViewPager没有滑到尽头的回调方法,因此想到的解决方案是,在原来的最…

LabVIEW 三维机器人展示
本程序是使用solidworks绘制模型图,通过LabVIEW 2013导入wrl文件完成. 程序效果如下: (工程文件) (3维机器人模型) (控制界面,未做美化....因为实际上这部分程序只是一小部分,主程序运行时,这部分面板是不显示的~\(≧▽≦)/~啦啦啦) 程序下载: 百度网盘: http://pan.baidu.com/…

SqlServer2008查询性能优化_第一章
转载于:https://www.cnblogs.com/MiaoXin/p/5813207.html
Python之类
1、类的结构 1.使用面向对象开发,第一步是设计类 2.使用 类名() 创建对象,创建对象的动作有两步 1.在内存中为对象分配空间 2.调用初始化方法__init___ 为对象初始化 3.对象创建后,内存中就有了一个对象的实实在在的存在--实例 因此…

祝大家圣诞节快乐!
在圣诞节来临之际,分享这份网页的代码,祝愿大家圣诞节快乐!点击这里查看效果 以下是源代码,可以保存到html文件打开看效果: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…
【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout
(一)先来简单回顾一下UICollectionView *UICollectionView的简单使用可以看我以前写的这篇博文:UICollectionView的基本使用 UICollectionView与UITableView很相似,必须实现两个代理:UICollectionViewDataSource和UI…
python之文件
1、什么是文件指针? 文件指针 文件指针标记从哪个位置开始读取数据 第一次打开文件时,通常文件指针会指向文件的开始位置 当执行了read方法后,文件指针会移动到读取内容的末尾 创建一个当前目录下的文件pass 内容为: westos …

一个6年的菜鸟,在4年之前做的一些功能(二)
前戏:针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么设计的,由于我的第一篇博客在首页被管理员移走了,大家可以点击这里来跳转,看下第一篇的目录结构。本人作为老菜鸟,和大家分享的也是…

Oracle11.2新特性之listagg函数 (行列转换)
SELECT regexp_substr(公司1,贵公司2, [^,], 1, LEVEL, i) FROM dualCONNECT BY LEVEL < length(公司1,贵公司2) - length(REPLACE(公司1,贵公司2, ,, )) 1 以上为字符串带分隔符的转换为列 Oracle11.2新增了LISTAGG函数,可以用于字符串聚集,测试如下…
Mac 安装Android Studio
一、下载 可以通过以下这些网站下载Mac版的Android Studio http://www.androiddevtools.cn http://www.android-studio.org 二、安装 双击下载好的dmg文件,拖曳安装。 拷贝完成之后,在应用程序中打开Android Studio。这时候会引导进行环境安装和设置…
iscsi网络磁盘共享
iscsi(Internet SCSI)支持从客户端(发起端)通过IP向远程服务器上的ISCSI存储设备(目标)发送scsi命令。ISCSI限定名称用于确定发起端和目标,并采用iqn.yyy-mm.{reverse domain}:label的格式。 默认情况下,网…
转: IO设计模式:Reactor和Proactor对比
转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构ÿ…

程序员该怎样放松?8个好网站推荐
1)看风景程序员每天在液晶屏幕下工作很长时间,应该让干涩的眼睛得到好好的放松,偶尔看看窗外的绿树或远处的风景可能是不错的方式,但是这在北京上海广州这样的大城市里不太现实,所以这里推荐一个纯粹的分享旅行照片的网…
【iOS】UIButton 图标在上文字在下
iOS默认的UIButton是图片在左文字在右,但是很多时候需求是图片在上文字在下(如效果图1、效果图2),因此想到,通过写一个JXButton继承自UIButton,并重写相关方法即可,以后项目中需要用的话就直接使…
多线程和mysql
多线程 1、多线程的定义: 什么是线程: 线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中, 是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不…

poj2154-color-polyan次二面体+欧拉函数优化
N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度,然后可以利用欧拉函数,把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…
【iOS】通讯录分组方式展示数据
本例子是将后台返回的医生列表(包含姓名和电话,demo从plist文件读取),按拼音进行分组显示(A-Z),最终效果如下图: 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母ÿ…
LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)
client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解: 优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理 很巨大的请求量,这种方式…

【LeetCode】136. Single Number 解题小结
题目: Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…
iOS小技巧积累
平时项目中用到的,记录下来(持续更新)。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦
1:如果无法保证子类行为的一致性,那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的,都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高,慎…
varnish 实现 CDN 缓存系统构建
cdn 搭建 (server1:172.25.1.1 ) : [roottest1 ~]# ls varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [roottest1 ~]# yum install * -y [roottest1 ~]# cd /etc/varnish/ [roottest1 varnish]# vim /etc/sysconfig/varnish [roottest1 varnish]# sysct…

创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…
【Android】AsyncTask异步类
一、关于AysncTask AsyncTask使得多线程编程更加简单,AsyncTask能在后台线程执行异步任务,并且在UI线程更新界面,而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类,类关系如下: public abstract class As…

高手速成android开源项目【blog篇】
主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神,深挖大神的项目和following,你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址:https://github.com/JakeWharton代表作:ActionBarSherlock&a…
3、LVS_TUN实现负载均衡
LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档
以下内容来自Android官方文档。 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期…

关于MSSQL导入导出时主键与约束丢失的问题解决
导入数据时,使用默认选项,会丢失主键、约束、默认值等属性,按如下步骤操作:-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询:不要使用默认选项,选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解
Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活。本文通过一个网络服务器模型,来实践Java5的多线程编程,该模型中使用了Java5中的线程池,阻塞队列…
LNMP架构的搭建
LNMP 架构的搭建 基础架构图 环境: server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…