相信不少朋友,已经从我的朋友圈中看到了这个题目,不知道你们的答案对不对哈,写这篇文章之前,我对这方面的知识点也是不了解,平常的话,用的也少,也没有去关注这些细节的东西,发现朋友圈还是有不少基础扎实的小伙伴哈,同样,也有很多跟我一样python基础不扎实的小伙伴,哈哈。确实,很多人可能之前跟我一样,学这个python的时候,都是快速的走马观花,简单地看了一下文档之后就开始上手写脚本了,然后一般的脚本中可能也不会涉及到这些用法。
可能,很多人会好奇,为什么你明明会一些这种语言的基础用法了,还要去往深入的开始学习这些呢,直接去学测开不好吗?针对这个问题,其实我也不是没有尝试过,最近也有买过一些课程来学习,以前是准备绕过自动化直接去学测开的内容,后来发现,基础掌握的不扎实的话,到后面可能会摔倒。通往罗马的道路不止一条,把基础知识再好好巩固一下的话,会发现,之前写过的一些代码,都可以进行优化,很多情况下,不用再去写很多冗余的脚本了。
言归正传,我们先不纠结上面那道题目到底会输出什么。接下来,我们一起看一下python中,类里面的__new__和__init__方法有什么区别和联系,相信在看完之后,你会知道上面的答案。
__new__:这是object类里面的一个静态方法,用于创建和返回一个对象的实例。第一个参数是类本身。__new__方法通常用于定制对象的创建过程,例如创建单例模式、缓存对象等。一般情况下,__new__方法不需要用户自己实现,因为Python提供了默认实现。
__init__是在实例创建后被调用的方法,用于初始化实例的属性。它不返回任何值,只接受self和其他参数。__init__方法通常用于初始化实例的状态,例如给实例的属性赋值。它是一个实例方法,第一个参数是self,表示当前实例对象。
__new__方法是在对象创建之前被调用的,而__init__方法是在对象创建之后被调用的。因此,在__new__方法中,对象可能还没有完全初始化,而在__init__方法中,对象已经被完全初始化。__new__方法必须返回一个实例对象,否则将无法调用__init__方法。
最后,再来两个案例巩固练习一下吧:
案例一:看看以下代码输出啥
这个题目主要考察的是,元组对象在调用__new__方法的时候就已经初始化好数据了,而列表要在调用__init__的时候才会初始化数据。因此,上面的脚本输出结果:
('1', '2', '3')
('1', '2', '3')
[]
[1, 2, 3, 4, 5]
案例二:自定义一种新类型的元组NewTuple,对于传入的可迭代对象,我们只保留其中字符串类型且长度大于4的元素.
比如:
print(NewTuple((1, 2, "hi", "小博", "小博测试", "小博测试成长之路"))) # ('小博测试成长之路',)
print(NewTuple([1, 2, 3, "hello", "world"])) # ('hello', 'world')