python中魔法方法
2022/1/3 17:08:20
本文主要是介绍python中魔法方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
python中魔法方法
1、__del__方法
销毁魔术方法
触发时机:当一个对象在内存中被清理的时候自动执行
参数:至少有一个self,接收对象
返回值:无
作用:在对象清理的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
class Person(object): def __init__(self): print('init') def __del__(self): print('销毁了') person = Person() person1 = person print('程序结束了')
输出为:
init 程序结束了 销毁了
如上代码所示,当程序运行结束时,没有再引用的变量时,__del__会生效,所以它不是像我们预想的那样,调用这个对象时__del__就生效,所以 不会输出
2、__call__方法
call():当给对象加括号时候,自定触发的函数
进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()
class Foo: def __init__(self): pass # 当给对象加括号时候,自定触发的函数 def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __init__,将Foo内存地址赋值给了obj obj() # 内存地址加括号就是调用
输出为:
__call__
如上代码所示,调用__call__时,并不需要Foo.call。因为在obj=Foo()时,就已经将Foo()的内存地址赋值给了obj,所以后面调用时obj本身就代表了那个内存地址,当成函数使用obj()
3、__str__方法
触发时机:打印对象会自定触发的函数,方法
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
class People: school = 'SH' # 1. 打印对象会自定触发的函数,方法 # 2. 返回值必须是字符串类型 def __str__(self): return self.school stu = People() print(stu)
输出为:
SH
在python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如果希望打印对象的属性值,可以使用__str__(self)这个方法。
4、__new__方法
实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__
class Person(object): # 初始化 def __init__(self): print('init...') # 实例化方法(构造方法)---》创建对象 def __new__(cls, *args, **kwargs): print('new...') ret = super().__new__(cls) # 调用父类的__new__()方法创建对象,并用接收返回值 return ret # 将对象返回给person
输出为:
new... init... <__main__.Person object at 0x0000012173217B80>
如上代码所示,要先创建一个对象,才能初始化,所以输出是先输出new…,才输出init…
5、getattr、setattr、__delattr__函数
getattr:对象.属性,当属性不存在,会自动触发__getattr__方法
setattr:给不存在属性赋值的时候执行,会自动触发__setattr__方法
delattr:当删除属性的时候还行,**会自动触发__delattr__方法
class Foo: x = 1 def __init__(self, y): self.y = y # 当访问一个不存在的属性时候,会自定触发 def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # print(key) # print(value) # self.key = value # 这就无限递归了,你好好想想 self.__dict__[key] = value # 应该使用它 def __delattr__(self, item): print('----> from delattr') # del self.item #无限递归了 self.__dict__.pop(item) obj = Foo(10) obj.z = 10 print(obj.a) # 不存在的属性
输出为:
----> from setattr ----> from setattr ----> from getattr:你找的属性不存在 None
这篇关于python中魔法方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Python编程基础
- 2024-11-01Python 基础教程
- 2024-11-01用Python探索可解与不可解方程的问题
- 2024-11-01Python编程入门指南
- 2024-11-01Python编程基础知识
- 2024-11-01Python编程基础
- 2024-10-31Python基础入门:理解变量与数据类型
- 2024-10-30Python股票自动化交易资料详解与实战指南
- 2024-10-30Python入行:新手必读的Python编程入门指南
- 2024-10-30Python入行:初学者必备的编程指南