1、面向对象的扩展:魔法方法【重点】

疑问:面相对象是什么?到底应该怎么用?
面向对象:分(类和对象)–>分(特征和属性方法)–>总(项目收尾)

什么是魔法方法:魔法方法是一种特殊的方法,从Object继承而来,在类型中体现为两个下划线开头和结尾的方法,有一地你给的特殊作用,如__str__()方法用于在直接打印输出对象时,展示给用户的字符串信息,默认情况下是内存地址,开发人员可以按照自己的需要进行自定义输出。
__class__  : 魔法属性,用于查看当前对象的类型,类似type()操作
__delattr__ :魔法方法,用于删除当前对象的一个属性
__dict__ :魔法方法,将对象中的数据按照字典的形式输出
__dir__ :魔法方法,和dir() 类似,查看当前类型/对象,都有哪些操作
__doc__ :魔法属性,用于查看当前对象的文档注释
# 代码1:比较两个人的年龄大小
class Person:
"""人"""
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("大牧", 18)
p2 = Person("小李", 16)
# 比较两个人的年龄
print(p1.age > p2.age)

魔法方法中的算数运算

__ge__(other):对应的比较符号:>|<
__eq__(other):对应的比较符号:==|!=
__lt__(other):对应的比较符号:<
__le__(other):对应的比较符号:< =

魔法方法操作

     > : grant than : gt< : less than : lt== : equals   : eq!=  : not equals :ne重写魔法方法#代码 1: 比较两个人的年龄大小class Person:
"""人"""def __init__(self,name,age):self.name = nameself.age = agedef __ge__(self,other):#判断大小if self.age >= other.agereturn Truereturn Falsedef __gt__(self,other):if self.age > other.age:return Falsedef __eq__(self,other):if self.name == other.name and self.age == other.age:return Truereturn Falsep1 = Person("席少",20)
p2 = Person("小王",16)
p3 = Person("小王",16)#比较两个人的年龄
print(p1.age > p2.age)
#模拟生活中两个人的比较,默认比较的是年龄
print(p1 >= p2)
print(p1 > p2)
print(p1 == p2)
print(p3 == p2)

set集合中是怎么判断两个数据是否重复的?

Python中的集合,再添加一个数据到集合中时,会通过__hash__()计算这个对象的哈希值,通过哈希值在集合中已经存在的数据中进行检索,如果相同哈希值的对象不存在直接添加,如果已经存在则继续调用对象的__eq__()方法判断要添加的对下哪个和已经添加的对象是否属于同一个对象,如果是同一个对象则表示数据重复不允许添加,如果不是同一个对象则允许添加。

Person自定义类型,怎么实现重复判断?

"""
需求:将自定义的用户对象数据存储到集合中,**默认身份证号码相同的用户是同一个人**。
"""class Person:def __init__(self,name,reg_no):self.name = nameself.reg_no = reg_nodef __str__(self):return f"<{self.name}>"def __repr__(self):return f"<{self.name}>"def __hash__(self):return f"<{self.name}>"def __eq__(self,other):if self.name == other.name and self.reg_no == other.reg_no:return Truereturn Falseif __name__ == "__main__":p1 = Person("席少","101")p2 = Person("小王","102")p3 = Person("小张","103")p4 = Person("小张","103")#集合去重s =set()s.add(p1)s.add(p2)s.add(p3)s.add(p4)print(s)

对象数据完全复制:

 深拷贝: import copy; copy.deepcopy()source = copy.copy(target) :将target浅拷贝一份赋值给sourcesource = copy.deepcopy(target) :将target深拷贝一份赋值给source

反射

反射:是生活中的反射接触最多的就是光线的反射,理解的更多的是镜子,反射其实就是通过一段字符信息,得到一个对象的结果,就类似生活中女朋友给男朋友说想要一个YSL口红,到某个节日的时候确实得到了这个口红。这个过程就是反射。
代码中的反射就是通过字符串信息,得到类型中/模块中的一个Python对象

hasattr(obj,attribute) #对象obj是否包含某个指定的attribute属性
getattr(obj,attribute)
delattr(obj,attribute)
setattr(obj,attribute)
"""
反射方法:通过一个字符串,反向查询类型中是否包含指定的属性数据
"""
class Person:def __init(self,name):self.name = namedef eat(self,food):print(f"{self.name}要吃饭了...{food}")#常规调用:我们知道类型中有什么属性和方法
p = Person("席少")
print(p.name)
p.eat("红烧肉")#反射调用:场景远程调用,不知道对方的类型中有什么属性和方法
#对方只是提供了 有name 属性,有eat()方法。具体是否包含不知道
p2 = Person("席少")
#判断对象中是否包含name属性
if hasattr(p2,"name"):#使用name属性,通过判断的方式避免了错误的发生print(p2.name)#反射调用name = getattr(p2,"name")print(name)

总结:反射,就是通过字符串来反向得到对象的属性数据,主要应用场景就是在数据接口远程调用时不知道类型中是否包含具体的属性或者方法,通过反射的形式得到属性和方法进行执行,避免了属性和方法不存在的错误导致程序崩溃!

p3 =Person("席少")
#常规调用:不清楚Person中是否有sleep().直接调用导致程序崩溃
#p3.sleep()
#反射调用:不清楚Person中是否有sleep(),反射调用不会导致程序出现问题
if hasattr(p3,"sleep"):p3.sleep()

Python面相对象魔法方法相关推荐

  1. python 类 对象 魔法方法概念+习题

    类 对象 类 对象是c++和java中都有的内容,python定义类的简单语法如下: class 类名: -类变量或者方法 Python 的类定义有点像函数定义,都是以冒号:作为类体的开始,以统一缩进 ...

  2. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

  3. 刻意练习:Python基础 -- Task11. 魔法方法

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  4. 还不会python面相对象?活该单身(面向对象基础+交互关系)

    文章目录 概述 名词解释 类的定义 类的实例化 类属性 两个对象的交互 依赖关系 关联关系 组合关系 类变量的用途 概述 活在当下的程序员应该都听过"面向对象编程"一词,之前太懒了 ...

  5. python入门——P41魔法方法:构造和析构

    魔法方法总是被双下划线包围 魔法方法是面向对象Python的一切 魔法方法的强大,体现在他们总能在合适的时候自动调用 __init__(self[, -]) 在实例被构造初始就需要属性,对一个对象进行 ...

  6. python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...

    楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...

  7. 从零开始学Python编程之魔法方法

    大家好,我是岛上程序猿,欢迎关注! Python中的魔法方法是一种特殊方法,以双下划线开头和结尾,并且可以在类定义中定义,用于执行特定的操作.在本文中,我们将介绍魔法方法的作用.如何使用它们以及Pyt ...

  8. Python面向对象、魔法方法

    文章目录 写在篇前 封装 继承 单继承 Mixin 抽象 多态 特殊方法&属性 特殊属性 魔法方法 辅助知识 OOP实用函数 迭代器生成器 写在篇前   OOP(Object Oriented ...

  9. Python中的魔法方法

    1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...

最新文章

  1. 网络教育统考计算机和英语作文,网络教育统考英语作文模板分享三
  2. 利用Console来调试JS程序、Console用法总结
  3. 大楼通信综合布线系统_系统梳理一下综合布线系统的方方面面
  4. linux shell 脚本 supress,《linux Shell 脚本攻略》进阶学习(第一部分)
  5. MySQL的环境变量配置详细步骤
  6. 如何生成时间序列matlab,求助:在MATLAB里如何输入时间序列中的时间
  7. 冲刺!11.14-11.15
  8. uniapp---为什么使用uniapp_以及uniapp开发的app展示_使用hbuilderx简单搭建一个uniapp_一次开发_小程序_Android_IOS_快应用通用工作笔记002
  9. SAP系统企业内部安全审计介绍
  10. BOOTSTRAP学习之路(1)
  11. qt调用import sys库_【开源库】使用Qt.py进行开发
  12. 水晶报表客户机电脑报错“CrystalDecisions.CrystalReports.Engine.ReportDocument”
  13. lpop 原子_这个知识孩子掌握了吗?初中化学原子的结构知识梳理
  14. 田洪川(天轰穿)老师谈.NET学习:将励志和教学结合起来
  15. 如何把真实地形数据DEM导入world machine制作地形
  16. VS修改软件生成的 exe名称
  17. #(九)、江恩关注的古代数理必要的解读
  18. DragonBones(龙骨动画)在Unity端的使用
  19. qt5.6 mysql_qt 5.6 找不到 mysql 驱动解决
  20. vue实现刷新页面,页面回到顶部

热门文章

  1. 如何抠图换背景?分享好用的方法教程
  2. php随机几种图片,关于 PHP 随机图片那个衍生的一个小问题
  3. 基于STM32的OLED播放Bad apple
  4. 我的java学习路之循环学习应用demo3猜数字小游戏
  5. 区块链应用 | 企业区块链如何转型?学学当年的“干脆面”吧
  6. php 给图片增加边框,照片添加多图边框,如何给图片添加场景边框,多种边框模板提供选择...
  7. ClickHouse删除分区报错:Exception: Table or Partition in default.od event xdr followas not dropped Reason:
  8. Nginx高级之Rewrite规则
  9. linux 输出到终端
  10. Delphi中获取路径的函数