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间接获取被封 ...
随机推荐
- Java—IO流 文件的编码
文件的编码 package cn.test; import java.io.UnsupportedEncodingException; public class Demo15 { public sta ...
- 安装adobe,路径My Pictures或卷无效。请重新输入。
问题:安装adobe reader时,路径My Pictures或卷无效.请重新输入.我的光驱是D盘.因为是在虚拟机下安装的xp系统. 解决办法: GHOST WINXP2 My Pictures一般 ...
- Hadoop ->> Hadoop是什么?
Hadoop是什么? 1)Hadoop是一个分布式计算平台,程序员可以在不需要知道底层结构的情况下实现集群并行运算: 2)Hadoop不只是一个软件或者系统,它代表的是一个生态圈,一个做大数据分析计算 ...
- 在一个服务中实现 多个契约 和终结点 z
一个服务作为一系列终结点被定义的.每个终结点都有一个地址,绑定和契约.契约就是暴露终结点能力的.地址就是这些应用或服务从网络的哪个地址可找到,契约是关于如何访问他们的. 在终结点和契约间有一对多的关系 ...
- Opportunity的chance of success的赋值逻辑
该字段的值和另外两个字段Sales Stage和Status都相关. 从下列function module CRM_OPPORT_H_PROB_SET_EC可看出,当status不为代码中的这些硬编码 ...
- 前端开发css禁止选中文本
在我们日常的Java web前端开发的过程中呢,程序员们会遇到各种各样的要求,所以不每天学的东西感觉自己都退步了,都更不上时代的发展了. 每天应对各种需求,每天活在疑问中就是我们程序员的真是写照.但我 ...
- expected expression __bridge
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013020103/article/details/30491117 expected expres ...
- linux下时间同步的两种方法分享(转)
与一个已知的时间服务器同步 代码如下: ntpdate time.nist.gov 其中 time.nist.gov 是一个时间服务器. 删除本地时间并设置时区为上海 复制代码 代码如下: rm -r ...
- 使用ParseExact方法将字符串转换为日期格式
实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...
- C语言输出格式
1 一般格式 printf(格式控制,输出表列) 例如:printf("i=%d,ch=%c\n",i,ch); 说明: (1)“格式控制”是用双撇号括起来 ...