当前位置: 首页 > 编程日记 > 正文

面向对象概念及三大特点

面向对象:

面向对象的基本概念

面向对象   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.对象创建后,内存中就有了一个对象的实实在在的存在--实例 因此…

祝大家圣诞节快乐!

在圣诞节来临之际&#xff0c;分享这份网页的代码&#xff0c;祝愿大家圣诞节快乐&#xff01;点击这里查看效果 以下是源代码&#xff0c;可以保存到html文件打开看效果&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout

&#xff08;一&#xff09;先来简单回顾一下UICollectionView *UICollectionView的简单使用可以看我以前写的这篇博文&#xff1a;UICollectionView的基本使用 UICollectionView与UITableView很相似&#xff0c;必须实现两个代理&#xff1a;UICollectionViewDataSource和UI…

python之文件

1、什么是文件指针&#xff1f; 文件指针 文件指针标记从哪个位置开始读取数据 第一次打开文件时&#xff0c;通常文件指针会指向文件的开始位置 当执行了read方法后&#xff0c;文件指针会移动到读取内容的末尾 创建一个当前目录下的文件pass 内容为&#xff1a; westos …

一个6年的菜鸟,在4年之前做的一些功能(二)

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

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函数&#xff0c;可以用于字符串聚集&#xff0c;测试如下…

Mac 安装Android Studio

一、下载 可以通过以下这些网站下载Mac版的Android Studio http://www.androiddevtools.cn http://www.android-studio.org 二、安装 双击下载好的dmg文件&#xff0c;拖曳安装。 拷贝完成之后&#xff0c;在应用程序中打开Android Studio。这时候会引导进行环境安装和设置…

iscsi网络磁盘共享

iscsi(Internet SCSI)支持从客户端&#xff08;发起端&#xff09;通过IP向远程服务器上的ISCSI存储设备&#xff08;目标&#xff09;发送scsi命令。ISCSI限定名称用于确定发起端和目标&#xff0c;并采用iqn.yyy-mm.{reverse domain}:label的格式。 默认情况下&#xff0c;网…

转: IO设计模式:Reactor和Proactor对比

转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE&#xff0c;事件模型都使用的Reactor模式&#xff1b;而同样做事件处理的Proactor&#xff0c;由于操作系统的原因&#xff0c;相关的开源产品也少&#xff1b;这里学习下其模型结构&#xff…

程序员该怎样放松?8个好网站推荐

1&#xff09;看风景程序员每天在液晶屏幕下工作很长时间&#xff0c;应该让干涩的眼睛得到好好的放松&#xff0c;偶尔看看窗外的绿树或远处的风景可能是不错的方式&#xff0c;但是这在北京上海广州这样的大城市里不太现实&#xff0c;所以这里推荐一个纯粹的分享旅行照片的网…

【iOS】UIButton 图标在上文字在下

iOS默认的UIButton是图片在左文字在右&#xff0c;但是很多时候需求是图片在上文字在下&#xff08;如效果图1、效果图2&#xff09;&#xff0c;因此想到&#xff0c;通过写一个JXButton继承自UIButton&#xff0c;并重写相关方法即可&#xff0c;以后项目中需要用的话就直接使…

多线程和mysql

多线程 1、多线程的定义&#xff1a; 什么是线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位&#xff08;程序执行流的最小单元&#xff09;。它被包含在进程之中&#xff0c; 是进程中的实际运作单位。一个进程中可以并发多个线程&#xff0c;每条线程并行执行不…

poj2154-color-polyan次二面体+欧拉函数优化

N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度&#xff0c;然后可以利用欧拉函数&#xff0c;把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…

【iOS】通讯录分组方式展示数据

本例子是将后台返回的医生列表&#xff08;包含姓名和电话&#xff0c;demo从plist文件读取&#xff09;&#xff0c;按拼音进行分组显示(A-Z)&#xff0c;最终效果如下图&#xff1a; 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母&#xff…

LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)

client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解&#xff1a; 优点&#xff1a;负载均衡器只负责将请求包分发给物理服务器&#xff0c;而物理服务器将应答包直接发给用户。所以&#xff0c;负载均衡器能处理 很巨大的请求量&#xff0c;这种方式…

【LeetCode】136. Single Number 解题小结

题目&#xff1a; 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小技巧积累

平时项目中用到的&#xff0c;记录下来&#xff08;持续更新&#xff09;。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦

1&#xff1a;如果无法保证子类行为的一致性&#xff0c;那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的&#xff0c;都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高&#xff0c;慎…

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 后&#xff0c;本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…

【Android】AsyncTask异步类

一、关于AysncTask AsyncTask使得多线程编程更加简单&#xff0c;AsyncTask能在后台线程执行异步任务&#xff0c;并且在UI线程更新界面&#xff0c;而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类&#xff0c;类关系如下&#xff1a; public abstract class As…

高手速成android开源项目【blog篇】

主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神&#xff0c;深挖大神的项目和following&#xff0c;你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址&#xff1a;https://github.com/JakeWharton代表作&#xff1a;ActionBarSherlock&a…

3、LVS_TUN实现负载均衡

LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档

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

关于MSSQL导入导出时主键与约束丢失的问题解决

导入数据时&#xff0c;使用默认选项&#xff0c;会丢失主键、约束、默认值等属性&#xff0c;按如下步骤操作&#xff1a;-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询&#xff1a;不要使用默认选项&#xff0c;选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解

Java5增加了新的类库并发集java.util.concurrent&#xff0c;该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易&#xff0c;灵活。本文通过一个网络服务器模型&#xff0c;来实践Java5的多线程编程&#xff0c;该模型中使用了Java5中的线程池&#xff0c;阻塞队列…

LNMP架构的搭建

LNMP 架构的搭建 基础架构图 环境&#xff1a; server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…