面向对象之魔术方法

本文详细介绍了Python中的魔术方法,包括特殊属性、创建、初始化与销毁、可视化、类型转换等。强调了`__new__`、`__init__`和`__del__`在对象生命周期中的作用,以及`__call__`在实现缓存、类装饰器和函数式编程中的应用。还讨论了`__str__`和`__repr__`在字符串表示中的重要性,并解释了上下文管理器的工作原理和实现方式。
摘要由CSDN通过智能技术生成

魔术方法

定义: 在Python中,所有用"__"包起来的方法,都称为【魔术方法】(eg: __len__, __init__)。魔术方法一般是为了让显示器调用的,你自己并不需要调用它们。

特殊属性

魔术方法名称 功能
__name__ 类、函数、方法等的名字
__module__ 类定义所在的模块
__class__ 对象或类所属的类
__bases__ 当前类的基类(父类)
__doc__ 类、函数的文档帮助,没有定义为None
__mro__ Method Resolution Order 方法解析顺序
__dict__ 类或实例的属性,可写的字典
__dir__ 返回类或者对象的所有成员名称列表

注意:1). 如果dir([obj]) 参数obj包含方法 __dir__(),该方法将被调用。
2). 如果Obj 不包含 __dir__(),该方法将最大限度收集属性信息

创建,初始化与销毁

python 中__new__ , __init__ , __call__的区别?
1). new的功能是在生成对象之前执行的内容,接受的参数是cls 类, 负责对象的创建
2). init的功能是在对象生成之后执行的内容, 接受的参数是self 对象, 负责对象的初始化
3). call的功能是在调用对象时执行的内容, 可以模拟函数的行为.
新建一个对象 x=someclass() 的时候经历的步骤:
1). 第一: __new__先创建类并返回类的实例。
2). 第二: 自动调用__init__来初始化函数的值。
3). 汇总: 第一步和第二步共同构成了【构造函数】。
4). 第三步: 对象生命周期调用结束时,del 方法(构析函数)会被调用。

new方法理解:

#此代码new方法没有返回对象,因此没有执行构造方法,需要new方法返回一个对象传到构造方法中构造方法才可以执行。
class Person(object):
    _instance=None #设置类属性,存储已经创建好的对象
    def __new__(cls, *args, **kwargs):
        print('new方法在实例化对象前执行返回对象本身')
    def __init__(self):#构造方法需要python传入一个对象才可以执行
        print('....')
if __name__ == '__main__':
    p1=Person()   #实例化对象,先执行new方法,new方法返回一个对象,构造方法接收new方法返回的对象,才能执行构造方法。

执行结果:
new方法在实例化对象前执行返回对象本身

call方法调用理解:

class Person(object):
    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)
    def __init__(self):
        print('init')
    def __call__(self, *args, **kwargs):
        print('call')
p1=Person()
p1() #对象的调用(类似于函数的调用),调用对象时执行call方法。

执行结果:
new
init
call

应用范例一: call魔术方法实现缓存

from functools import lru_cache#导入缓存
class Fib(object):
    @lru_cache(ma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值