面向对象之魔术方法· 第1篇《__init__方法,__new__方法》

坚持原创输出,点击蓝字关注我吧

作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。

由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!

目录

  • 一、什么是魔术方法(魔法方法、特殊方法)

    • 1.__init__有什么作用?

    • 2.什么是魔术方法?

    • 3.创建一个对象的时候,调用的第一个方法是什么?

  • 二、 __new_方法

    • 1.__new_方法

    • 2.为什么创建出来的对象会变成 None?

    • 3.不写 return 返回对象

    • 4.返回的不是 MyClass()类创建出来的对象

  • 三、补充上篇文章

一、什么是魔术方法(魔法方法、特殊方法)

1. __init__有什么作用?

创建对象的时候,类自动调用这个方法,对实例进行初始化设置的。在特定的情况下触发的,不需要手动的去调用。

2.什么是魔术方法?

在 Python 中像__init__这类双下划线和结尾的方法,我们把它统称为魔术方法。

注意点:

魔术方法都是 Python 内部定义的,自己不要去定义__init__这种双下划线开头的方法。

因为 Python 在不断发展,万一你定义的双下划线开头结尾的方法,被 Python 也定义并加在魔术方法里面来了。那么就和 Python 内部的魔术方法起冲突了。

3.创建一个对象的时候,调用的第一个方法是什么?

调用类去创建对象的时候,__init__方法触发对象,做初始化的属性设置。调用的第一个方法不是__init__,是__new__方法。

class MyClass(object):
    def __init__(self,name):
        self.name=name

m = MyClass("qinghan")
print(m.name)

二、 __new_方法

1.__new_方法

这个__new_方法是在__init_方法之前执行的。__new_方法一般不去重写。

object源码:

Python 中万物皆对象,类创建出来对象叫做对象,类、函数其实也是对象。

2.为什么创建出来的对象会变成 None?

在重写 new 方法的时候,一定要调用父类的 new 方法,来完成对象的创建,并将对象返回出去。

参数:cls

cls代表的是类对象本身。

重写下__new__方法:

这个时候不能创建一个对象出来。为什么是个空类型?

原来是能创建对象的,重写__new_方法之后,对象没有了。

object源码中有写道:

Create and return a new object

这里没有返回东西,所以报错。

不知道return什么。「自己写的_new_方法并没有写创建对象的代码。创建对象的代码是 Python 内部实现的,我们自己不知道怎么实现。」

子类里调用下父类的方法,并进行返回就行了。继承的是object

所以,将代码修改加上这段代码:

「第一种调用父类的方法:」

return super().__new__(cls)# 调用父类的__new__方法

父类是object,对象是父类的方法 new 出来的。

「第二种调用父类的方法:」

父类是object,直接用父类的名字去调用。

加上这段代码:

return object.__new__(cls)

代码
class MyClass(object):
    def __init__(self,name):
        self.name=name
# 重写下__new__方法
    def __new__(cls, *args, **kwargs):
        print("这个是new方法")
        # 子类里调用下父类的方法,并进行返回
        # return  super().__new__(cls)#  调用父类的__new__方法
        return object.__new__(cls)


m = MyClass("qinghan")
print(m.name)
# print(m)

3.不写 return 返回对象

如果

# return  super().__new__(cls)#  调用父类的__new__方法
        # return object.__new__(cls)

这 2 句都没有,可以看下。

如果不写return返回对象的话,不会进入__init_。没有创建对象返回出来,__init_就没有对象初始化,必须先由__new__方法返回一个对象。

4.返回的不是 MyClass()类创建出来的对象

假如返回个字符串return '666',返回的不是这个MyClass()类创建出来的对象,是不会进来初始化的。

三、补充上篇文章

补充 测开之函数进阶· 第 8 篇《多个装饰器装饰同一个函数,三个内置的装饰器》一文。

user.txt 的内容:

{"user":"python01","pwd":"qinghan","token":False}

目录结构:


公众号「清菡软件测试」首发,更多原创文章:清菡软件测试 118+原创文章,欢迎关注、交流,禁止第三方擅自转载。

感谢关注清菡,欢迎点击在看和转发!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值