在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希望维护代码前,还需要从头至尾的通读一遍吧,就好像一间杂乱无章的房子,你想找一件想要的东西,但是需要地毯式的搜索一遍,甚至多遍才能找到。很明显,这样做的话,很浪费我们的时间。

多态:顾名思义就是多种形态,即便不知道变量所引用的对象类型是什么,依旧可以对它操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。

例如 符号'+',在对数值操作和字符串操作所表现出的不同行为

数值操作

 intsum=+
print(intsum)

输出结果: 3

字符串操作:

strSum='hello'+'Python'
print(strSum)

输出结果:helloPython

很明显,符号'+'对数值和字符串表现出了两种行为,一种是数值的相加,一种是字符串的拼接。

唯一能毁掉多态的就是使用函数显示的检查类型。比如type,isinstance以及issubclass函数,在不知道对象是什么类型,但是又想对对象做点什么

的时候,就可以使用多态,但要避免使用毁掉多态的方式。

使用案例说明这一点。

假设,我们平台有个支付功能,用户将商品放入购物车后计算出总价后点击支付按钮即可完成支付。此时使用一个元祖即可实现。

 ('SPAM',)

但客户提出一个新的要求,对商品添加一个拍卖功能,谁出价最高,商品归谁。显然之前简单的计算商品价格且将总价放入元祖里已经不能满足当前的需求,因为元祖是不可变的。

此时就需要不断的获取最新价格。直到竞拍价格达到客户满意为止。为了实现这个功能,代码每次询问价格的时候,对象都需要检查当前的价格。

 def getPrice(object):
if isinstance(object,tuple):
return object[]
else:
return magic_network_method(object)

但此时,调皮的程序员,想要换另外一种方式表示商品价格。比如字典。没关系,我们继续更新代码。

 def getPrice(object):
if isinstance(object,tuple):
return object[]
elif isinstance(object,dict):
return int(object['price'])
else:
return magic_network_method(object)

但是如果有人希望为存储在其他键下面的价格增加新的字典类型时,我们又需要更新代码,很明显,这是一件很繁琐的工作。如果我们能让对象自己操作,每个新的对象类型都可以检索和计算自己的价格并返回结果,且只需要向它询问价格即可。这时候,多态就可以帮我们解决这个问题。

多态和方法:

程序接收一个对象,完全不了解该对象内部的实现方式,它可能有一种或多种形态(实现方式),但是我们仅需要询问价格即可。

 object.getPrice()

封装:

回顾多态的概念,多态是指让用户对于不知道是什么类(对象类型)的对象进行方法调用。例如

 def Add(x,y):
print( x+y)
Add(,)
Add('hello ','world')

输出结果:

hello  world

当我们的Add方法写好后,调用者只要知道传入几个参数,但并不需要知道该方法的实现细节(即便是简单的print (x+y))也不需要关心参数类型是什么(第一个是两个数值,第二个是两个字符串),因为他仅仅关心的是输出的结果3或hello world.其实封装跟多态类似,但又有所不同。封装仅不需要关心对象是如何构建的而可以直接使用。

继承:先看如下代码

 class Person:
def __init__(self,name,age,address):
self.name=name
self.age=age
self.address=address
def say(self):
print('你好,我叫 %s我今年%s岁 我来自%s 职业不详 '%(self.name,self.age,self.address))
person=Person(name='张三',age=,address='beijing')
person.say() class Student(Person):
def __init__(self,name,age,address,job):
self.job=job
Person.__init__(self,name=name,age=age,address=address)
def say(self):
print('你好,我叫 %s我今年%s岁 我来自%s 我是%s,我正在学习Python教程'%(self.name,self.age,self.address,self.job))
men=Student(name='李四',age='',address='河北',job='学生')
men.say()
class Teacher(Person):
def __init__(self,name,age,address,job):
self.job=job
Person.__init__(self,name=name,age=age,address=address)
def say(self):
print('你好,我叫 %s我今年%s岁 我来自%s 我是%s,我正在教授Python教程'%(self.name,self.age,self.address,self.job))
teacher=Teacher(name='王五',age='',address='河北',job='教师')
teacher.say()

显示结果:

 你好,我叫 张三我今年18岁 我来自beijing 职业不详
你好,我叫 李四我今年18岁 我来自河北 我是学生,我正在学习Python教程
你好,我叫 王五我今年28岁 我来自河北 我是教师,我正在教授Python教程

从代码中可以看出,我们先写了一个Person类,又写了学生类和教师类且在括号中使用了之前定义的Person类。我们在学生类和教师类的实例化时(__init__)通过Person.__init__(name=name,age=age,address=address)即可在实例化学生类或教师类时同时实例化Person类中的属性,通过代码可以看出,我们只在Person中对name,age,address写了属性赋值代码,但在学生类和教师类实例化时依旧可以使用。这就是Person的继承关系。当一段代码或者函数被多处调用时,可以将该段代码或者函数抽象为一个对象,其他对象继承该对象后就可以像引用自己内部属性一样对父类的代码进行操作。

python学习之对象的三大特性的更多相关文章

  1. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  2. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  3. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  4. 浅谈python的对象的三大特性之继承

    前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...

  5. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  6. OC学习6——面相对象的三大特性

    我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...

  7. IOS开发学习笔记010-面向对象的三大特性

    面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...

  8. python学习——面对对象进阶

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass a = Foo() print(isins ...

  9. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

随机推荐

  1. VC简单嵌入汇编

    转自:http://blog.csdn.net/arcsinsin/article/details/8126473 内嵌汇编的使用方法是: __asm {        语句 } 你可以把它插入程序中 ...

  2. vue v-on 带参事件

    1.js代码 var list=[ //定义一个数组 {title:} ] var box=new Vue({ el:'.box', data:{ list:list }, methods:{ //d ...

  3. March 21 2017 Week 12 Tuesday

    Sometimes ever, sometimes never. 相聚有时,后会无期. Maybe love is something we can't touch but we can feel w ...

  4. scrum3

    首先我一直做的是框架的设计,但不同的是这次我们整合完善了这个软件目前的所有需求也定义好了它的大题框架,总的来说设计部分已经结束,现在也就是本次冲刺,我们将重点进行整个软件的数据库编程环节,也就是用SQ ...

  5. 团队第四次SCrum

    scrum 第四次冲刺 一.项目目的        为生活在长大的学生提供方快捷的生活服务,通过帖子发现自己志同道合的朋友,记录自己在长大点滴.本项目的意义在于锻炼团队的scrum能力,加强团队合作能 ...

  6. 怎么在overflow-y:sroll的情况下 隐藏滚动条

    当我们的内容超出了我们的div,往往会出现滚动条,影响美观. 尤其是当我们在做一些导航菜单的时候.滚动条一出现就破坏了UI效果.  我们不希望出现滚动条,也不希望超出去的内容被放逐,就要保留鼠标滚动的 ...

  7. table中设置tr行间距

    CSS border-collapse 属性设置表格的边框是否被合并为一个单一的边框 值 描述 separate 默认值.边框会被分开.不会忽略 border-spacing 和 empty-cell ...

  8. Android(java)学习笔记41:Map集合功能概述

    1. 下面通过代码引入Map集合: 如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生 ...

  9. Codeforces 336C 0-1背包

    题意:每个水果有两个值,一个美味度 a,一个卡路里 b,从中挑选一些,要求 sum(aj) / sum(bj) = k,使得 sum(a) 最大. 分析:没有那个条件就是一个01背包,可以转换,对公式 ...

  10. Fy's dota2 题解

    题目描述 Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 ...