# 多态

## 概念:    一种事物具备多种不同的形态    例如:水  固态 气态 液态       官方解释: 多个不同类对象可以响应同一个方法,产生不同的结果 首先强调多态不是一种特殊的语法,而是一种状态,特性(既多个不同对象可以响应同一个方法,产生不同的结果 )既多个对象有相同的使用方法,好处:​  对于使用者而言,大大的降低了使用难度 ​  我们之前写的USB接口,下的鼠标,键盘,就属于多态   

## 实现多态:

接口 抽象类 鸭子类型 都可以写出具备多态的代码,最简单的就是鸭子类型  

案例:要求:# 要管理 鸡 鸭 鹅# 如何能够最方便的 管理,就是我说同一句话,他们都能理解# 既它们拥有相同的方法

"""class JI:    def bark(self):        print("哥哥哥")

    def spawn(self):        print("下鸡蛋..")

class Duck:    def bark(self):        print("嘎嘎嘎")

    def spawn(self):        print("下鸭蛋")

class E:    def bark(self):        print("饿饿饿....")

    def spawn(self):        print("下鹅蛋..")

j = JI()y = Duck()e = E()

def mange(obj):    obj.spawn()

mange(j)mange(y)mange(e)

# python中到处都有多态a = 10b = "10"c = [10]

print(type(a))print(type(b))print(type(c))```

## isinstance    判断一个对象是否是某个类的实例    参数1 要判断的对象    参数2 要判断的类型issubclass    判断一个类是否是另一个类的子类    参数一是子类    参数二是父类

# str__str__  会在对象被转换为字符串时,转换的结果就是这个函数的返回值使用场景:我们可以利用该函数来自定义,对象的是打印格式

# del执行时机: 手动删除对象时立马执行,或是程序运行结束时也会自动执行使用场景:当你的对象在使用过程中,打开了不属于解释器的资源:例如文件,网络端口

# del使用案例

class FileTool:     """该类用于简化文件的读写操作 """

     def __init__(self,path):         self.file = open(path,"rt",encoding="utf-8")         self.a = 100

     def read(self):         return self.file.read()   # 在这里可以确定一个事,这个对象肯定不使用了 所以可以放心的关闭问文件了def __del__(self):    self.file.close()tool = FileTool("a.txt")print(tool.read())

## call执行时机:在调用对象时自动执行,(既对象加括号)

测试:#call 的执行时机class A:    def __call__(self, *args, **kwargs):        print("call run")        print(args)        print(kwargs)

a = A()a(1,a=100)## slots

该属性是一个类属性,用于优化对象内存占用优化的原理,将原本不固定的属性数量,变得固定了这样的解释器就不会为这个对象创建名称空间,所以__dict__也没了从而达到减少内存开销的效果另外当类中出现了slots时将导致这个类的对象无法在添加新的属性

# slots的使用class Person:

    __slots__ = ["name"]    def __init__(self,name):        self.name = name

p =  Person("jck")

# 查看内存占用# print(sys.getsizeof(p))# p.age = 20 # 无法添加

# dict 没有了print(p.__dict__)# getattr setattr delattrgetattr 用点访问属性的时如果属性不存在时执行setattr 用点设置属性时delattr 用del 对象.属性  删除属性时 执行这几个函数反映了 python解释器是如何实现 用点来访问属性

getattribute 该函数也是用来获取属性在获取属性时如果存在getattribute则先执行该函数,如果没有拿到属性则继续调用 getattr函数,如果拿到了则直接返回

# [] 的实原理

## getitem setitem delitem

任何的符号 都会被解释器解释成特殊含义 ,例如 .  [] ()getitem 当你用中括号去获取属性时 执行setitem  当你用中括号去设置属性时 执行delitem 当你用中括号去删除属性时 执行

# 运算符重载

当我们在使用某个符号时,python解释器都会为这个符号定义一个含义,同时调用对应的处理函数, 当我们需要自定义对象的比较规则时,就可在子类中覆盖 大于 等于 等一系列方法....

案例:

原本自定义对象无法直接使用大于小于来进行比较 ,我们可自定义运算符来实现,让自定义对象也支持比较运算符class Student(object):    def __init__(self,name,height,age):        self.name = name        self.height = height        self.age = age

    def __gt__(self, other):        # print(self)        # print(other)        # print("__gt__")        return self.height > other.height

    def __lt__(self, other):        return self.height < other.height

    def __eq__(self, other):        if self.name == other.name and  self.age == other.age and self.height == other.height:            return True        return False

stu1 = Student("jack",180,28)stu2 = Student("jack",180,28)# print(stu1 < stu2)print(stu1 == stu2)

上述代码中,other指的是另一个参与比较的对象,

大于和小于只要实现一个即可,符号如果不同  解释器会自动交换两个对象的位置

# 迭代器协议

迭代器是指具有__iter__和__next__的对象我们可以为对象增加这两个方法来让对象变成一个迭代器案例:class MyRange:

    def __init__(self,start,end,step):        self.start = start        self.end = end        self.step = step

    def __iter__(self):        return self

    def __next__(self):        a = self.start        self.start += self.step        if a < self.end:            return a        else:            raise StopIteration

for i in MyRange(1,10,2):    print(i)### 上下文管理

上下文 context

这个概念属于语言学科,指的是一段话的意义,要参考当前的场景,既上下文在python中,上下文可以理解为是一个代码区间,一个范围 ,例如with open  打开的文件仅在这个上下文中有效涉及到的两个方法:

## enter​  表示进入上下文,(进入某个场景 了)

## exit  表示退出上下文,(退出某个场景 了)

当执行with 语句时,会先执行enter ,当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息包含错误的类型.错误的信息.错误的追踪信息

注意:enter 函数应该返回对象自己exit函数 可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用如果为True 则意味着,异常以及被处理了False,异常未被处理,程序将中断报错多态:是一种状态,如果程序具备这种状态,对象的使用者,可以很方便忽略对象之间的差异我们可以通过鸭子类型来让程序具备多态性

转载于:https://www.cnblogs.com/Fzhiyuan/p/11266704.html

面向对象之多态,魔法函数相关推荐

  1. 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...

  2. exit函数_全面深入了解 Python 魔法函数

    (点击上方公众号,可快速关注一起学Python) 作者:浪子燕青       链接: http://www.langzi.fun/Python魔法函数.html 魔法函数概念 魔法函数是以双下划线开头 ...

  3. Golang笔记-面向对象编程-多态/类型断言

    面向对象编程-多态 基本介绍 变量(实例)具有多种形态.面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的.可 以按照统一的接口来调用不同的实现.这时接口变量就呈现不同的形态. 快速入门 ...

  4. 【转】面向对象之多态(向上转型与向下转型)

    转:https://blog.csdn.net/qq_31655965/article/details/54746235. 多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢 ...

  5. c/c++入门教程 - 2.4.7 多态、函数地址晚绑定(重写,虚函数,纯虚函数,抽象类,虚析构,纯虚析构)

    目录 4.7 多态 4.7.1 多态的基本概念(超级重要) 4.7.2 多态的原理刨析(超级重要) 4.7.2 多态案例一:计算器类 4.7.3 纯虚函数和抽象类 4.7.4 多态案例二 - 制作饮品 ...

  6. C++面试题-面向对象-多态性与虚函数

    C++面试题-面向对象-多态性与虚函数 问:在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"? 答:C++语言支持函数重载,C语言不支持函数重载.函数被C+ ...

  7. python中的多态用法_Python面向对象之多态原理与用法案例分析

    本文实例讲述了Python面向对象之多态原理与用法.分享给大家供大家参考,具体如下: 目标 多态 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 ...

  8. Python面向对象之多态

    一.什么是多态? 一句话概括:父类类型接收子类对象. 多态是面向对象的三大特征之一. 多态从字面上理解是多种形态,一个对象可以以不同的形态去呈现. eg:狗(狼狗.藏獒.哈士奇.古牧 ...) 多态比 ...

  9. 面向对象理解——多态

    何为多态 定义: 多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式.系统在运行时(而非编译时),能够根据其类型确定调用哪个重载的成员函数的能力 ...

  10. Java面向对象:多态——基于继承的向上转型、方法重写、动态绑定

    Java面向对象:多态 1.多态的概念 2.向上转型和向下转型 (1)向上转型 (2)向下转型 3.方法重写 4.动态绑定与静态绑定 5.多态的优缺点 ======================== ...

最新文章

  1. Mysql 索引原理及优化
  2. Re:从零开始的机器学习 - Machine Learning(一) 线性回归
  3. Python深度学习之分类模型示例,MNIST数据集手写数字识别
  4. DL之NN/CNN:NN算法进阶优化(本地数据集50000张训练集图片),六种不同优化算法实现手写数字图片识别逐步提高99.6%准确率
  5. Azure系列2.1.13 —— CloudBlockBlob
  6. Unity 协程原理探究与实现
  7. js之函数设置默认值传参
  8. CSS垂直居中的11种实现方式
  9. hdu 2896 AC自动机
  10. VUE引入阿里icon
  11. 计算机专业职业生涯规划书,计算机专业职业生涯规划书2000字.doc
  12. 信号与系统matlab实验报告,信号与系统实验报告.doc
  13. 树木分形迭代图 matlab,园林设计中分形理论的引入
  14. 【Bug】Microsoft Edge拒绝访问
  15. 超能陆战队:迪士尼画风的漫威英雄
  16. Premiere 关键帧缩放
  17. CDP、私域运营及数字营销相关名词一览
  18. android写代码截屏微信,微信等头像截取的实现 - 拉风的道长_Android之路 - OSCHINA - 中文开源技术交流社区...
  19. 清北学堂noip2018集训D2
  20. 角逐“互联网+疫苗”赛道,百度健康杀入医药电商巨头腹地

热门文章

  1. 怎样启用win7的超级管理员账户
  2. 区块链概念——学习笔记
  3. 应用程序进程启动过程
  4. Cloudflare推出域名注册服务:不赚利润只收取成本费
  5. SerializeUtil 序列化 java
  6. 浏览器滚动的详细解释 Vue 固定滚动位置的实现
  7. swift 雨燕 新手教程
  8. listView基本实现
  9. laravel 淘宝 NPM 镜像
  10. WAS6.1在JDK1.5环境下JSP无法编译问题