1、定义

在类里面,使用__xx__()形式的方法。这一类方法可以在类被构建的时候隐式调用,从而实现多种功能。也可以通过重载这些魔术方法,来实现自定义的功能。

2、常用的魔术方法

2.1 __new__方法

分配内存对象并返回,返回的实际上是self的内存地址,如果定义了__new__但是不返回,那么其下的__init__将不会执行;但如果不定义__new__,会自动分配内存地址。

class Pig:def __new__(cls, *arg, **kwargs):print('distribute memory space')obj = object.__new__(cls)print(obj)# return objdef __init__(self):print('Born a pig!')
p=Pig()

class Pig:def __new__(cls, *arg, **kwargs):print('distribute memory space')obj = object.__new__(cls)print(obj)return objdef __init__(self):print('Born a pig!')p=Pig()

2.2 __init__方法

初始化魔术方法

2.3 _del__方法

从内存中清除对象,对象会默认执行方法。具体执行的时间节点

程序执行完毕,释放内存
执行del指令时
class Pig1:def __init__(self,value):print("对象被初始化了:{}".format(value))def __del__(self):print("对象被删除了")    p=Pig1("test")
print('program finished!')

2.4 __call__方法

当对象以函数方式调用时,会自动调用__call__

class Flight:def __init__(self,number):self.number=numberprint(f"{number}号航班")#办理登机手续def checkIn(self):print("办理登机手续")#安全检查def securityCheck(self):print("安全检查")#登记,起飞def boarding(self):print("起飞,登机")def __call__(self,*args,**kwargs):self.checkIn()self.securityCheck()self.boarding()print("__call__被调用了")
#实例化一个对象f
f=Flight("CA1426")
#以函数的方式调用f
f()
#以函数的方式调用对象会自动调用__call__
#以下输出的结果


如果注视掉f()

# f()

那么就不会调用__call__,只会调用__init__,输出为:

2.5 __str__方法

在打印类对象时调用。使用str强制转换数据类型,在输出结果时调用。

class Dog:def __init__(self,name):self.name=namedef __str__(self):return f"这是一条叫{self.name}的狗"d=Dog("阿毛")
print(d)
#自动调用__self__


注意:

  1. 必须print(d),__str__才会被自动调用
  2. __str__里必须返回一个string对象,如果将其定义中的return换成print,那么程序会报错

2.6__repr__方法

与__str__一样,也是输出对象的字符串格式,最大的不同在于,__repr__在可变容器(list,dict)中会被默认调用,否则,如果一个类中同时定义了__str__方法和__repr__方法,那么只会调用__str__方法 ,而不会调用__repr__方法

class Dog:def __init__(self,name):self.name=namedef __str__(self):return f"这是一条叫{self.name}的狗"def __repr__(self):print("调用repr魔术方法")return f"dog:{self.name}"
d=Dog("阿毛")
print(d)

class Dog:def __init__(self,name):self.name=namedef __str__(self):return f"这是一条叫{self.name}的狗"def __repr__(self):print("调用repr魔术方法")return f"dog:{self.name}"
d=Dog("阿毛")
print(d)
x=[d]
print(x)

str和repr都调用了

2.6 getitem(self, key)获取dict中某个key的值

初始化类对象后自动调用

2.7 setitem(self, key, value)设置dict数据

初始化类对象后自动调用

python进阶1:魔术方法相关推荐

  1. python描述符魔术方法_Python类型转换的魔术方法详解

    本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建 ...

  2. python 中的魔术方法 getitem setitem

    python 中的魔术方法 getitem setitem https://docs.python.org/3/reference/datamodel.html?highlight=iter#obje ...

  3. python 类的魔术方法_python中类的魔术方法

    目的:学习python中class的magic methods,提高编程效率. 环境:ubuntu 16.4   python 3.5.2 在学习class时一定会接触到它的magic methods ...

  4. python 析构函数_常用的python类的魔术方法

    对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言.在其他面向对象的语言中有构造函数.析构函数等等在生命周期不同时机自动调用的函数,python当然也是有的.除此之 ...

  5. python中的魔术方法

    魔术方法 魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发. 1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发 ...

  6. Python中的魔术方法详解

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 __init__ ,P ...

  7. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  8. Python笔记_20_魔术方法

    文章目录 魔术方法(特定时机自动触发) `__init__` (构造方法) `__new__`魔术方法 `__del__ `(析构方法) `__call__ ` 魔术方法 `__str__` 魔术方法 ...

  9. Python 中的魔术方法(双下划线开头和结尾的方法)

    https://gitbook.cn/books/5ffd564919f81e0b10c9e39f/index.html https://www.cnblogs.com/pyxiaomangshe/p ...

  10. 详细介绍Python中的“魔术方法“__XXX___; 概述__str__()方法;__new__()方法; 三. __ new__ 和__init__的区别

    概述 一.__str__方法 当不用__str__()时: 发现输出结果只有对象一串id地址信息; 当我们想打印出更多信息时,用__str__()方法; 二.new()方法 三. __ new__ 和 ...

最新文章

  1. 伍六七带你学算法 进阶篇-三数之和
  2. NSURLSession简介与入门
  3. 概念炒作的背后,“智能合约”的真相是什么?
  4. 分布式框架-日志系统思路及实现
  5. Documentum中关于日期时间类型字段的特殊处理
  6. 三个案例,解读静态代码块和构造代码块
  7. 23种设计模式中的解释器模式
  8. 23种设计模式----------代理模式(一)
  9. AtCoder Regular Contest 120 C - Swaps 2 线段树模拟
  10. freebsd运行php,FreeBSD学习笔记16-FreeBSD下安装PHP
  11. 计算机专业基础 -- Linux系统相关基础知识
  12. 无需依赖Adobe Acrobat,在Java中进行PDF格式转换全新攻略
  13. HTML小游戏7 —— 《罗斯魔影》魔法消除游戏(附完整源码)
  14. 计算机主板过热报警,利用电脑主板BIOS的报警声音辨别电脑故障
  15. SpringBoot整合Cache缓存技术(二十一)
  16. 入侵手游服务器修改数据库,如何入侵手游服务器数据库
  17. content-box和boder-box的区别
  18. Dell服务器电源配置规则
  19. CCIE理论-第十二篇-IPV6-NDP协议
  20. java 1603,win10系统安装软件提示功能传送错误1603的处理方法

热门文章

  1. r语言kendall协和系数_列联表篇之十一:有序数据的Kendall协和系数
  2. 手写文字怎么识别转换?有哪些练字的方法?
  3. C#读取计算机的机器码、网卡、设备码
  4. [生存志] 第125节 针道针具取穴
  5. java结果写入html,java - 将长字符串写入HTML文件,InputStream vs FileWriter vs BufferedReader - 堆栈内存溢出...
  6. VMware-server-2.0.0-101586注册码备下来
  7. Node.js创造者Ryan Dahl专访
  8. 做棋牌,该怎么设计你的代码
  9. 模拟软件-OLED及太阳能电池的模拟软件(漂流扩散模块)-[Setfos]
  10. 智慧养老之基于RFID技术下的智慧养老解决方案-养老院智能看护系统-新导智能