python学习之对象的三大特性

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

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

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

数值操作

1 intsum=1+2
2 print(intsum)

输出结果: 3

字符串操作:

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

输出结果:helloPython

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

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

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

使用案例说明这一点。

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

1 (‘SPAM‘,100)

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

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

1 def getPrice(object):
2     if isinstance(object,tuple):
3         return object[1]
4     else:
5         return magic_network_method(object)

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

1 def getPrice(object):
2     if isinstance(object,tuple):
3         return object[1]
4     elif isinstance(object,dict):
5         return int(object[‘price‘])
6     else:
7         return magic_network_method(object)

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

多态和方法:

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

1 object.getPrice()

封装:

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

1 def Add(x,y):
2     print( x+y)
3 Add(1,2)
4 Add(‘hello  ‘,‘world‘)

输出结果:

     3
hello  world

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

继承:先看如下代码

 1 class Person:
 2     def __init__(self,name,age,address):
 3         self.name=name
 4         self.age=age
 5         self.address=address
 6     def say(self):
 7         print(‘你好,我叫 %s我今年%s岁 我来自%s 职业不详 ‘%(self.name,self.age,self.address))
 8 person=Person(name=‘张三‘,age=18,address=‘beijing‘)
 9 person.say()
10
11 class Student(Person):
12     def __init__(self,name,age,address,job):
13         self.job=job
14         Person.__init__(self,name=name,age=age,address=address)
15     def say(self):
16         print(‘你好,我叫 %s我今年%s岁 我来自%s 我是%s,我正在学习Python教程‘%(self.name,self.age,self.address,self.job))
17 men=Student(name=‘李四‘,age=‘18‘,address=‘河北‘,job=‘学生‘)
18 men.say()
19 class Teacher(Person):
20     def __init__(self,name,age,address,job):
21         self.job=job
22         Person.__init__(self,name=name,age=age,address=address)
23     def say(self):
24         print(‘你好,我叫 %s我今年%s岁 我来自%s 我是%s,我正在教授Python教程‘%(self.name,self.age,self.address,self.job))
25 teacher=Teacher(name=‘王五‘,age=‘28‘,address=‘河北‘,job=‘教师‘)
26 teacher.say()

显示结果:

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

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

原文地址:https://www.cnblogs.com/SunIan/p/9729298.html

时间: 2025-01-23 03:36:51

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

黑 马 程 序 员_视频学习总结<Objective-C>----02 三大特性

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------  面向对象的三大特性(精华):(成员变量.方法)封装.继承.多态. 一.封装 1.为什么需要封装? 根据以前学的内容,假如我声明一个student类,里面有public成员age..我在主函数中写代码 student *s = [studentnew].这样的话我可以通过s→age修改age的值,但是会出现s→age=-10这种赋值,但是我们都

黑马程序员— OC基本语法、类和对象、三大特性

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲     OC简介及基本语法 Objective-C简称OC是在C语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,也就是可以在OC代码中混入C语言代码,甚至是C++代码.可以使用OC开发Mac OS X平台和IOS平台的应用程序.简单的介绍了一下OC,下面我们来看看OC的基本语法,学习OC之前我们先学习了C语言,因为OC是在C语言的基础上的一门开发语言,因此OC的很多基本语法

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

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ? 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类. ? 在Python中实现继承非常简单,在声明类的时候,在类名后面添加一个小括号,就可以完成继承关系.单纯的从代码的层面上来看当两个类具有相同的功能或者特征的时候就可以使用继承.提取一个父类,这个父类中编写者两个类相同的部分,然后两个类分别去继承这个类就可以

Golang-面向对象编程三大特性-继承、多重继承

Golang-面向对象编程三大特性-继承 继承基本介绍和示意图 继承可以解决代码复用,让我们的编程更加靠近人类思维. 当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体(比如刚才的Student),在该结构体中定义这些相同的属性和方法. 其它的结构体不需要重新定义这些属性(字段)和方法,只需嵌套一个 Student 匿名结构体即可. [画出示意图] 也就是说:在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和

Golang-面向对象编程三大特性-多态

Golang-面向对象编程三大特性-多态 基本介绍 变量(实例)具有多种形态.面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的.可以按照统一的接口来调用不同的实现.这时接口变量就呈现不同的形态. 快速入门 在前面的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态特性.[点明] 接口体现多态的两种形式 多态参数 在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态.

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

我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问(该隐藏的隐藏,该暴露的暴露).封装的主要目的是: 隐藏类的实现细节 让使用者只能通过预先定义好的方法来访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问 可进行数据检查,从而有

python学习面对对象三大特性

一. 继承 1. 单继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现 语法: class 派生类名(基类名) ............. 子类以及子类实例化的对象,可以访问父类的任何

Python学习_01_对象

之前关于python的知识比较零散,这一个系列的随笔将python重新学习整理一遍.学习书籍<Python核心编程>第二版. Python对象基础 python并不是一个单纯面向对象的语言,他融合了其他语言,如函数式语言的特性.但是python的面向对象也是很强大的. 所有的Python对象都具有三个属性:身份(id),类型(type),值(value).身份属性可以通过内建函数id()获得,可以看做是对象的内存地址,每个对象的id值都是唯一的,所以可以用id来判断两个对象是否是同一块内存的不

python学习笔记之面向对象编程特性(二)

面向对象程序设计中的术语对象(Object)基本上可以看做数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.传统意义上的"程序=数据结构+算法"被封装"掩盖"并简化为"程序=对象+消息".对象是类的实例,类的抽象则需要经过封装.封装可以让调用者不用关心对象是如何构建的而直接进行使用. 首先说明一下python编程规范: #!/usr/bin/env python #coding=utf-8 #编程规范,示例如下:   class