作者:清菡
博客:oschina、云 + 社区、知乎等各大平台都有。
由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!
__init__
有什么作用?__new_
方法
__new_
方法__init__
有什么作用?创建对象的时候,类自动调用这个方法,对实例进行初始化设置的。在特定的情况下触发的,不需要手动的去调用。
在 Python 中像__init_
这类双下划线和结尾的方法,我们把它统称为魔术方法。
魔术方法都是 Python 内部定义的,自己不要去定义__init_
这种双下划线开头的方法。
因为 Python 在不断发展,万一你定义的双下划线开头结尾的方法,被 Python 也定义并加在魔术方法里面来了。那么就和 Python 内部的魔术方法起冲突了。
调用类去创建对象的时候,__init_
方法触发对象,做初始化的属性设置。
调用的第一个方法不是__init_
,是__new__
方法。
class MyClass(object):
def __init__(self,name):
self.name=name
m = MyClass("qinghan")
print(m.name)
__new_
方法__new_
方法这个__new_
方法是在__init_
方法之前执行的。__new_
方法一般不去重写。
看object
源码:
Python 中万物皆对象,类创建出来对象叫做对象,类、函数其实也是对象。
在重写 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)
如果
# return super().__new__(cls)# 调用父类的__new__方法
# return object.__new__(cls)
这 2 句都没有,可以看下。
如果不写return
返回对象的话,不会进入__init_
。没有创建对象返回出来,__init_
就没有对象初始化,必须先由__new__
方法返回一个对象。
假如返回个字符串return '666'
,返回的不是这个MyClass()
类创建出来的对象,是不会进来初始化的。
补充 测开之函数进阶· 第 8 篇《多个装饰器装饰同一个函数,三个内置的装饰器》一文。
user.txt 的内容:
{"user":"python01","pwd":"qinghan","token":False}
目录结构:
公众号清菡软件测试首发,更多原创文章:清菡软件测试 118+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。