返回顶部
首页 > 资讯 > 后端开发 > Python >多态和封装
  • 820
分享到

多态和封装

多态 2023-01-30 23:01:19 820人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

一、多态 术语多态(polymorphism)源自希腊语,意思是“有多种形态”。这大致意味着即便你不知道变量指向的哪种对象,也能够对其执行操作,且操作的行为将随所属的类型而异。例如,假设你要为一个销售食品的电子商务网站创建在线支付系统,

一、多态

术语多态(polymorphism)源自希腊语,意思是“有多种形态”。这大致意味着即便你不知道变量指向的哪种对象,
也能够对其执行操作,且操作的行为将随所属的类型而异。
例如,假设你要为一个销售食品的电子商务网站创建在线支付系统,程序将接受来自系统另一部分的购物车。因此你只需要计算总价并从信用卡中扣除费用即可。
你首先想到的可能是,指定程序收到商品时必须如何表示。例如,呢可能要求用元组表示收到的商品。如下所示:
('apple',4)
如果你只需要描述性标签和价格,这样的表示很好,但不灵活。假设该网站新增了拍卖服务,即不断降低商品的价格,直到有人购买为止。
在这种情况下,如果能够允许用户像下面这样做就好了:将商品放入购物车并进入结算页面,等到价格合适时再点击支付。
然而,使用简单的元组表示商品无法做到这一点。要做到这一点,表示商品的对象必须在你编写的代码询问价格时通过网络检查其当前价格,也就是说不能像在元组中那样固定价格。要解决这个问题,可创建一个函数。

def get_price(object):
    if isinstance(object,tuple):
        return object[1]
    else:
        return magic_network(object)

# 这里使用isinstance 来执行类型检查旨在说明:使用类型价差通常是馊主意,应尽可能避免。
前面的代码使用函数isinstance来检查object是否是元组。如果是,就返回其第二个元素,否则就调用一个神奇的网络方法。
如果网络方法已就绪,问题就暂时解决了。但这种解决方案还是不太灵活。如果有位程序员很聪明,决定用十六进制的字符串表示价格,并将其存储在字典的‘price'键下呢?没问题,你只需要更新相应的函数。

def get_price(object):
    if isinstance(object,tuple):
        return object[1]
    elif isinstance(object,dict):
        return int(object['price'])
    else:
        return magic_network(object)

你确定现在考虑到了多样的可能性了吗?假设有人决定添加一种新字典,并在其中将价格存储在另一个键下,你该如何办呢?当然,可再次更新get_price,但这种应对之策在多长时间内有效呢? 每当有人以不同的方式实现对象时,你都需要重新实现你的模块。如果你将该模块卖给了别人,转而从事其他项目开发,客户该怎么办?显然。这种实现不同行为的方式既不灵活也不切实际。

那么该如何做呢?让对象自己去处理这种操作。这好像没什么大不了,但仔细想想将发现,这样事情将简单得多:每种新对象都能够获取或计算并返回结果,而你只需要向它们询问价格即可。这正是多态的用武之地。

多态和方法

你收到一个对象,却根本不知道它是如何实现的----它可能是众多“形态”中任何一种。你只知道可以询问其价格,但这就够了。至于询问价格的方式,你应该熟悉。

print(object.get_price())
4

像这样与对象属性相关的函数称为方法。
其实好多内置函数就用来多态的方式。

str1= “abcd"
str1.count("a")
len(str1)
list1 = [1,2,3,4]
len(list1)

像这样无需知道变量是字符串还是列表就能调用方法len,只要你能向这个方法提供一个字符作为参数,它就能正常运行。

 多态形式多样

每当无需知道对象是什么样的就能对其执行操作时,都是多态在起作用。这不仅仅适用于方法,我们还通过内置运算符合函数大量使用了多态。

print(1 + 2)
3
price("hello" + "world")
helloworld

上述代码表明,加法运算符号(+)即可用于数学运算,也可用于字符串(以及其他类型的序列)。
很多函数和运算符都是多态的,你编写的大多数函数也可能如此,即便你不是有意为之。每当你使用多态的函数和运算符时,多态都将发挥作用。
事实上,要破坏多态,唯一的方法就是使用诸如type、issubclass 等函数显式地执行类型检查,但你应尽可能避免以这种方式破坏多态。
重要的是,对象按你希望那那样行事,而非它是否是正确的类型(类)。然而,不用使用类型检查的禁令已不像以前那么严格。引入本章后面讲讨论的抽象基类和模块abc后,issubclass本身也就是多态了!

鸭子类型
多态是python编程方式的核心,有时称为鸭子类型。这个术语源自如下说法:如果走起来像鸭子,叫起来像鸭子,那么它就是鸭子。

二 、封装

封装(encapsulation)指的是向外部隐藏不必要的细节。这听起来有点像多态(无需知道对象内部的细节就可使用它)。
这两个概念很像,因为它们都是抽象的原则。它们都像函数一样,可帮助你处理程序的组成部分,让你无需关心不必要的细节。
但封装不同于多态。多态让你无需知道对象所属的类(对象的类型)就能调用其方法,而封装让你无需知道对象的构造方法就能使用它。
听起来还是有点像?下面看一个使用了多态但没有使用封装的示例。下来创建一个名为OpenObject的类。

class OpenObject():
    def __init__(self):
        pass    
    def set_name(self,name):
        self.name= name
    def get_name(self):
        return self.name

实例化一个对象

o=OpenObject()
o.set_name("Sir Lancelot")
o.get_name()
Sir Lancelot

通过像调用函数一样调用类来创建了一个对象,并将其关联到o,然后就可以使用方法set_name和get_name了。
一切看起来都完美无缺。然而,如果o将其名称存储在全局变量 global_name中呢?这意味着使用OpenObject类的实例时,你需要考虑global_name的内容,事实上,必须确保无人能修改它。

class OpenObject():
    name = "Sir Lancelot"
    def __init__(self):
        pass
    def set_name(self, name):
        OpenObject.name = name
    def get_name(self):
        return self.name

如果创建多个OpenObject,将出现问题,因为它们共用一个变量

o = OpenObject()
o1 = OpenObject()
print(o1.get_name())
o.set_name("Sir Grub")
print(o.get_name())
print(o1.get_name())

结果为:

Sir Lancelot
Sir Grub
Sir Grub

这说明在设置一个对象的名称时,将自动设置另一个对象的名称。这可不是想要的结果。基本上我们都希望对象时抽象的;当调用方法时,无需操心其他的操作,如避免干扰全局变量,如何将名称“封装”到对象中呢? 没问题,将其作为一个属性即可。
属性时归属于对象的变量,就像方法一样。实际上,方法差不多就是与函数相关联的属性,如果使用属性而非全局变量重新编写起那么的类,并将其重命名为CloseObject,就可以像下面这样做:

class OpenObject():
    def __init__(self):
        pass
    def set_name(self, name):
        self.name = name
    def get_name(self):
        return self.name
o = OpenObject()
o.set_name("Sir Grub")
print(o.get_name())
结果为:
Sir Grub

到目前为止一切顺利,但这并不能证明名称不是存储在全局变量中的。下面再来创建一个对象。

o1 = OpenObject()
print(o1.get_name())
结果为:
Sir Lancelot

从中可知正确的设置了新对象的名称,但第一个对现在怎么样了呢?

print(o.get_name())
Sir Grub

其名称还在! 因为这个对象有自己的状态,对象的属性由其属性(如名称)描述。对象的方法肯修改这些属性,因此对象将一系列函数(方法)组合起来,并赋予他们访问一些变量(属性)的权限,而属性可用在两次函数调用之间存储值。


--结束END--

本文标题: 多态和封装

本文链接: https://lsjlt.com/news/180934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 多态和封装
    一、多态 术语多态(polymorphism)源自希腊语,意思是“有多种形态”。这大致意味着即便你不知道变量指向的哪种对象,也能够对其执行操作,且操作的行为将随所属的类型而异。例如,假设你要为一个销售食品的电子商务网站创建在线支付系统,...
    99+
    2023-01-30
    多态
  • JAVA回顾:封装,继承,多态
    目录知识点回顾封装继承super注意点:Vs this:前提:构造方法多态总结知识点回顾 封装 封装(有时称为数据隐藏)是与对象有关的一个重要概念。从形式上来看,封装不过是将数据和...
    99+
    2024-04-02
  • Java中封装、继承和多态的示例分析
    这篇文章主要介绍Java中封装、继承和多态的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!封装所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的...
    99+
    2023-06-15
  • python学习之【继承、封装、多态】
    #来评选你心中的TOP1编程语言# 前言 距离上篇文章 python学习之【类和对象】已有三个星期之久,这篇文章介绍 面向对象的三大特征——封装,继承,多态。 对于编程初学者来说,学习python应...
    99+
    2023-08-31
    python 学习 开发语言
  • 面向对象封装、继承、多态
    一、面向对象封装   01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装...
    99+
    2023-01-31
    面向对象 多态
  • Python编程-封装,继承与多态
    目录一、类的封装1、案例演示2、案例分析3、解决方案1、封装的定义2、封装的实现3、案例演示一、类的封装 为什么需要封装: Python是面向对象的编程语言,因为面向对象中所有的实体...
    99+
    2024-04-02
  • 浅谈Java封装、继承、多态特性
    目录1.封装2.继承3.多态4.上代码,效果运行放在最后1.封装 什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就...
    99+
    2024-04-02
  • Python面向对象封装继承和多态示例讲解
    目录1. 封装2. 继承多态的实现面向对象的三大特征:封装,继承,多态 1.封装: 提高程序的安全性 将数据(属性)和行为(方法)包装到类对象中,在方法内部对属性进行对象的...
    99+
    2024-04-02
  • C语言也有封装,继承和多态你知道吗
    目录封装继承多态函数的指针通过函数的指针实现多态总结我们知道封装、继承、多态是面向对象的三大特性,我们也知道C语言是面向过程的语言,那么可不可以在面向过程的语言中用面向对象的思想编程...
    99+
    2024-04-02
  • java的三大特性封装、继承、多态
    我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理,为以后面向抽象的编程打下坚实的基础。  封装的概念还是很容易理解的。如果你会定义类,那么相信你对封装的概念已经完全掌握了。下面定义的几...
    99+
    2017-04-24
    java教程 java 封装 继承 多态
  • 新手初学Java继承、封装与多态
    目录面向对象的三大核心特性封装继承单继承继承的优缺点super关键字super调用父类构造方法super访问父类成员super和this的区别多态instanceof关键字方法重载方...
    99+
    2024-04-02
  • Java系列——封装、继承、多态初了解
    目录 一、前言 二、封装 1.什么是封装?   2.封装的特点 3.封装的使用 三、继承 1.什么是继承? 2.继承的特点 3.继承的优点 4.继承的使用  4.1 继承的格式  4.2 继承的演示 4.3 成员变量 4.4 成员方法 4...
    99+
    2023-09-27
    java
  • Java中的封装、继承和多态,你真的都懂了吗
    目录封装继承多态接口一些建议和小结写在最后的话封装 所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方...
    99+
    2024-04-02
  • Java中封装、继承、多态特性是什么
    这篇文章主要为大家展示了“Java中封装、继承、多态特性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中封装、继承、多态特性是什么”这篇文章吧。1.封装什么是封装,谈谈自己对封装的...
    99+
    2023-06-22
  • java封装继承多态的好处有哪些
    Java封装、继承和多态是面向对象编程的三个核心概念。它们的好处包括: 封装:封装可以隐藏对象的内部细节,只暴露必要的接口给其他...
    99+
    2024-02-29
    java
  • JavaScript的面向对象和它的封装、继承、多态简单介绍
    这篇文章主要介绍“JavaScript的面向对象和它的封装、继承、多态简单介绍”,在日常操作中,相信很多人在JavaScript的面向对象和它的封装、继承、多态简单介绍问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • Java面向对象基础知识之封装,继承,多态和抽象
    目录一、封装二、继承三、多态四、抽象总结一、封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或...
    99+
    2024-04-02
  • JavaScript中继承、封装、多态实现的示例分析
    小编给大家分享一下JavaScript中继承、封装、多态实现的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!面向对象的三...
    99+
    2024-04-02
  • PHP面向对象之封装,继承与多态详解
    在普通的编程中,没有涉及架构或者良好的设计,绝大多数都是使用的面向过程的方式。 当编程逐步深入后,就需要合理使用面向对象的知识来设计程序,而不是简单地脑海里有了思路就去写代码来实现,...
    99+
    2024-04-02
  • JavaOOP三大特征之封装继承与多态详解
    目录封装继承多态OOP语言的三大特征即:面向对象的三个比较重要的思想 封装 官话:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口进行交互 通俗讲,不让类...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作