学习之高阶编程init方法、call方法、new方法

面向对象进阶

一、魔术方法(魔法方法、特殊方法)–以双下划线开头双下划线结尾
问题一:__init__有什么作用?
在创建对象的时候,自动调用对 创建的对象 进行初始化设置的。
问题二:什么是魔术方法?
在python中像_init这类双下划线开头和结尾的方法,我们把它统称为术方法。
注意点:
魔术方法都是python内部定义的,自己不要去定义1emon这类双下划线先开头的方法
问题三:创建一个对象的时候,调用的第一个方法是什么?

class MyClass:

    def __init__(self): # 如果没有写__init__方法会默认调用父类的__init__方法
        pass


if __name__ == '__main__':
    obj = MyClass()
class MyClass:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        pass


if __name__ == '__main__':
    obj = MyClass()
    print(callable(obj))  # 当一个对象有__call__方法的时候 判断一个对象是否可调用--返回True
    obj()  # 如果一个类中没有定义__call__方法 会报:TypeError: 'MyClass' object is not callable Myclass对象不可调用

问题三:创建一个对象的时候,调用的第一个方法是什么?
1、__new_方法
问题:那么这个__new__方法呢,它有什么作用?又在什么时候会调用呢?

对象:new方法先创建,然后通过init方法初始化
注意点:
一般情况不要重写new方法,除非有特定的需求需要使用new方法来实现
定义了new方法之后,需要调用父类的new来创建对象并返回

new方法的应用场景?
2、单例模式—一个类只能创建一个对象(例如日志文件–播放器)
需求:类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?

class MyClass:
    def __new__(cls, *args, **kwargs):  # 创建对象--先执行new再执行init方法
        obj = super.__new__(cls)
        return obj  # 如果不返回,就不会创建对象

    def __init__(self):  # 给对象设置属性
        pass


if __name__ == '__main__':
    obj = MyClass()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值