在Python中,__init__和__new__是两个特殊的魔术方法(magic methods),它们在对象的创建和初始化过程中起着至关重要的作用。然而,由于它们的功能和用法有所不同,开发者常常容易误用这两个方法。以下是一些常见的误用情况:
1. 将__new__当作__init__使用
误用描述:__new__是一个静态方法,用于创建类的新实例,而__init__则用于初始化已经创建的对象。有时开发者会在__new__中执行应该放在__init__中的初始化逻辑。
正确做法:在__new__中只应包含与对象创建直接相关的逻辑,如分配内存、调用父类的__new__等。初始化对象的属性等任务应该放在__init__中。
2. 忘记调用父类的__new__或__init__
误用描述:在重写__new__或__init__时,如果忘记调用父类的相应方法,可能会导致对象创建或初始化不完全。
正确做法:在重写这两个方法时,通常需要使用super()来调用父类的方法,确保对象的正确创建和初始化。
3. 在__init__中尝试返回非None值
误用描述:__init__不应该返回任何值(它隐式地返回None),但有时候开发者可能会错误地尝试在__init__中返回某个值。
正确做法:__init__只负责初始化对象,不应该有返回值。如果需要在对象创建时返回特定的值或对象,应该在__new__中实现。
4. 混淆__new__和__init__的调用顺序
误用描述:有些开发者可能不清楚__new__在__init__之前被调用的顺序,导致在__init__中尝试访问尚未在__new__中创建或设置的属性。
正确做法:理解并记住__new__负责创建对象,而__init__负责初始化对象。因此,__new__会在__init__之前被调用。
5. 在不需要时重写__new__
误用描述:有时候开发者可能会不必要地重写__new__,仅仅是因为他们想要自定义对象的创建过程,但实际上这种自定义可以通过其他方式(如工厂函数或类方法)来实现。
正确做法:只有在确实需要控制对象的创建过程(如实现单例模式、继承不可变的类型等)时才应该重写__new__。否则,应该优先考虑使用其他更简单的方法。
6. 不理解__new__和__init__在继承中的行为
误用描述:在继承体系中,如果不理解__new__和__init__是如何被调用和传递的,可能会导致子类对象创建和初始化不正确。
正确做法:在继承时,确保理解并正确调用父类的__new__和__init__方法。如果需要改变这些方法的行为,请在子类中适当地重写它们,并确保调用父类的方法。
综上所述,__new__和__init__在Python对象创建和初始化过程中扮演着不同的角色。为了避免误用这两个方法,开发者需要清楚地理解它们的功能、调用顺序以及在继承中的行为。通过遵循上述的正确做法,可以确保对象的正确创建和初始化。
https://www.81uav.cn/com/lianyun/
https://www.81uav.cn/com/tufu/
https://www.81uav.cn/com/runde/
https://www.81uav.cn/com/lingke/
https://www.81uav.cn/com/ruiyi/
https://www.81uav.cn/com/dingfeng/
http://51waixie.cn/com/jinshengyuanlin/
http://51waixie.cn/com/hongmao/
http://51waixie.cn/com/dongyi/
http://51waixie.cn/com/liyunt/
http://51waixie.cn/com/anke/
http://51waixie.cn/com/bili/
https://www.81uav.cn/com/lanxiang/
https://www.81uav.cn/com/aichidianzi/
https://www.81uav.cn/com/yaoertai/
https://www.81uav.cn/com/jieweidianzi/
https://www.81uav.cn/com/baichuanyingfu/
https://www.81uav.cn/com/baoxin/
http://51waixie.cn/com/weijiajia/
http://51waixie.cn/com/taihang/
http://51waixie.cn/com/liulizhipin/
http://51waixie.cn/com/mintian66/
http://51waixie.cn/com/yixin/
http://51waixie.cn/com/zhikui/
https://www.sn180.com/member/24341941.html
https://www.sn180.com/member/24341936.html
https://www.sn180.com/member/24341942.html
https://www.sn180.com/member/24341943.html
https://www.sn180.com/member/24341944.html
https://www.sn180.com/member/24341946.html
https://www.clzg.cn/user/795764.html
https://www.clzg.cn/user/796144.html
https://www.clzg.cn/user/796145.html
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344253
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344255
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344257
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344347
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344349
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344350
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344469
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344471
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344473
https://h30471.www3.hp.com/t5/user/viewprofilepage/user-id/344476
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040412/viewspace-3062231/ ,如需转载,请注明出处,否则将追究法律责任。