python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希望维护代码前,还需要从头至尾的通读一遍吧,就好像一间杂乱无章的房子,你想找一件想要的东西,但是需要地毯式的搜索一遍,甚至多遍才能找到。很明显,这样做的话,很浪费我们的时间。
多态:顾名思义就是多种形态,即便不知道变量所引用的对象类型是什么,依旧可以对它操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。
例如 符号'+',在对数值操作和字符串操作所表现出的不同行为
数值操作
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学习之对象的三大特性的更多相关文章
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- 浅谈python的对象的三大特性之继承
前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
- IOS开发学习笔记010-面向对象的三大特性
面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...
- python学习——面对对象进阶
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass a = Foo() print(isins ...
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
随机推荐
- check_mk的性能案例
http://wiki.lustre.org/Check_MK/Graphite/Graphios_Setup_Guide Dell PowerEdge R515 2x 8-Core AMD Opte ...
- Linux(Ubuntu) 常用命令
玩儿转Linux:终端命令用法精选 最近再一次拾起了Ubuntu,为了更好的玩儿转Linux,专门到网上搜到的这些常用的终端命令,根据命令使用类别的不同分为了9个大类,都在下面一一列举了出来,个人觉得 ...
- 【转】OpenGL概述
英文原文 中文译文 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于 ...
- 48. Rotate Image (matrix retation, transpose) Amazon problem
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- ftp免交互上传文件脚本
ftp -i -n <<! open .x.x.x user yourFtpAccount yourPasswd cd /root/DailyBuild/webapps/ delete x ...
- 2018.11.11 Java的 三大框架:Struts+Hibernate+Spring
·定义:Java三大框架主要用来做WEN应用.Struts主要负责表示层的显示: Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作): Hibernate主要是数据持久化到数据库. ...
- js 原生获取Class元素
function getElementsByClassName(n) { var classElements = [] allElements = document.getElementsByTagN ...
- HDU 1226 超级密码(数学 bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others) ...
- Introduction to CQRS
原文链接: http://www.codeproject.com/Articles/555855/Introduction-to-CQRS What is CQRS CQRS means Comma ...
- 分享一个关于pthread线程栈在mm_struct里面的分布问题
大家好,本人被下面这个问题困扰了一段时间,最近似乎找到了答案. 这里和大家分享一下,可能对有相同困惑的同学有点帮助,同时也请各位帮忙看看错漏的地方. 1================问题: 在使用p ...