对象若是要思考的话应该是咱们对任何事物的一个抽象的说明,举个例椅子咱们能够说是一个对象,桌子也能够是个对象。可是这些都是咱们看得见或者摸得着的东西!python
在软件开发中对象的定义也没多大区别也是形容或者描述"东西",正式的讲:对象是一个数据以及相关行为的集合。数据库
(举个例子咱们来描述下椅子这个对象:编程
数据:长40厘米,宽50厘米,高100厘米模块化
方法:能够坐下,能够打人,能够吃饭,能够睡觉....函数
)工具
面向对象的简单的意思就是指向,因此面向对象的简单意思就是"功能上指向建模对象(某个功能指向对象好比写入数据库功能指向某个对象)"网站
常常搞混的:面向对象分析、面向对象设计、面向对象分析设计、面向对象编程这些术语都是TMD什么意思?spa
面向对象分析(OOA Object-Oriented Analysis):设计
着眼于一个问题、系统或者任务的过程,而且识别这些对象以及对象间的交互。分析咱们都要作什么,把一个网站(分析的对象),变成一个需求rest
最后需求出来:
面向对象设计(OOD Object-Oriented Design):
把需求转换为实践规范的过程,好比命名这些对象(命名)、定义行为(方法)、定义接口~
面向对象编程(OOP Object-Orientd programming):
是把设计转化成一个能够工做的程序的过程(写代码的过程)
可是实际上,在这个快节奏的世界,大部分开发恰好是一个"迭代式开发模型"。在迭代式开发中,会先模块化、设计和编程实现任务重的小部分,而后评估这个程序并经过扩展来改善每个特性,包括在一系列短的周期里增长新的特性
从新理解一下 封装、继承、和多态
学面相对象的时候咱们知道分装就是把:数据、方法封装到一个对象中。那封装的做用是什么?
用一句话归纳:隐藏细节提供公共接口(隔离复杂度)
举个很是形象的例子,看电视的时候咱们经过遥控器调节:节目数字、电视音量、声道等信息,遥控器就是电视这个对象提供的接口,操控方法(节目数字、音量大小、),电视机的属性(品牌、大小、等信息)
这里电视给咱们提供的统一接口你只要按遥控器就能够了,根本不须要管它是怎么实现信号传输、音量的大小、节目的调节的。
class Television(object): def __init__(self, master): self.master = master def add_show(self): print('%s操做当前节目ID加1' % self.master) def subtract_show(self): print('%s操做当前节目ID减1' % self.master) def add_volume(self): print('%s操做当前电视音量加1' % self.master) def subtract_volume(self): print('%s操做当前电视音量加1' % self.master)
咱们操做电视的时候,只需使用提供的这几个接口,具体内部怎么实现的咱们不须要关心。
接下来看下继承,能够经过“继承”(Inheritance)和“组合”(Composition)来实现。
组合
组合的概念:
眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,因此类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生(继承)而成。
举例来讲:
class Eye(object): def __init__(self, person): self.person = person def look(self, something): print('%s look %s' % (self.person, something)) class Head(object): def __init__(self, name, age): self.name = name self.age = age # 经过组合的方式吧Eye类里的方法组合起来 self.eye = Eye(self.name) def look(self, something): self.eye.look(something) ........
继承
先看一个接口的定义:建立一个没有实现任何放的类,这个类简单的告诉咱们这个类该作什么,可是绝对没有提供任何建议告诉咱们如何去作,在面向对象的世界里这样的的类称之为接口。
继承的概念就想一个家庭图谱,好比你父亲从你爷爷那里继承了姓氏(罗)你从你父亲那里继承了姓氏(罗),这种关系称之为继承。
多重继承
举个例子说就是你继承了你父亲眼睛的颜色,又继承了你母亲头发的颜色,这种在一个类中继承多个类的状况称之为:多重继承
可是只要两个类有不一样的借口,对于一个多重继承是无害的,可是若是咱们从两个重叠借口继承就会变得不好。好比你继承了"汽车类"又继承了"摩托车"类,它们都有一个move方法,当你调用move方法的时候,这个合成类到底该怎么作呢!
一般这种设计是错误的,出现这种状况看看是否能够把多重继承删掉,采用相似关联或者组合的设计
咱们能够说:
封装的做用是简化代码复杂度
继承的做用是增长代码重用性
那多态的做用呢?
多态的做用是增长接口重用性
先看一个接口的定义:建立一个没有实现任何放的类,这个类简单的告诉咱们这个类该作什么,可是绝对没有提供任何建议告诉咱们如何去作,在面向对象的世界里这样的的类称之为接口。
# !/usr/bin/env python3.5 # -*- coding:utf-8 -*- # __author__ == 'LuoTianShuai' import abc # 定义交通工具类 class Vehicle(object): # 基类定义接口使用abc强制约束子类必须重写move这个类 @abc.abstractmethod def move(self): pass # 给他的意义他能让乘坐它的人去某个地方 class Car(Vehicle): def __init__(self, car_name): self.car_name = car_name def move(self): print('%s正在移动.....' % self.car_name) class Subway(Vehicle): def __init__(self, line_name): self.line_name = line_name def move(self): print('%s正在移动.....' % self.line_name) """ 父类定义接口,子类实现,而后统一调用,只要你实现了这个接口谁管你是怎么实现的,可是都是统一调用接口 只要这个工具能动、能运输人 咱们就称他为交通工具 """ benz = Car('Benz') line10 = Subway('Beijing Subway line 10') benz.move() line10.move()
可是Python自己就是一们多态的语言动态语言,在Python中你不多据说多态的概念,在Python中的多态性一般称为鸭子类型:当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子
在鸭子类型中,关注的不是对象的类型自己,而是它是如何使用的。例如,在不使用鸭子类型的语言中,咱们能够编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数能够接受一个任意类型的对象,并调用它的走和叫方法。若是这些须要被调用的方法不存在,那么将引起一个运行时错误。任何拥有这样的正确的走和叫方法的对象均可被函数接受的这种行为引出了以上表述,这种决定类型的方式所以得名。
# coding=utf-8 class Duck(object): def quack(self): print("鸭子在嚎叫") class Swan(object): def quack(self): print("天鹅在嚎叫") class Goose(object): def quack(self): print("鹅在嚎叫") def in_the_forest(duck): duck.quack() duck_obj = Duck() bird_obj = Swan() doge_obj = Goose() for x in [duck_obj, bird_obj, doge_obj]: in_the_forest(x)