python不同版本的_new_不同点总结
作者:小妮浅浅 时间:2023-09-21 15:36:45
我们都知道python的版本不同,在使用的时候就有所区别。鉴于我们推荐小伙伴们选择python3版本,所以这方面的区别了解的不是很多。就拿_new_来说,在python2和3中的写法是不一样的,之前有接触_new_的小伙伴想必没有注意到这个问题。接下来讲讲new的基本用法,然后就python不同版本中_new_的区别带来详解。
new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__ called.'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__ called.'
self.name = name
self.age = age
def __str__(self):
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
piglei = Person('piglei', 24)
print piglei
Python3和 Python2中__new__使用不同
Python3的写法
class Singleton(object):
def __new__(cls,*args, **kwargs):
if not hasattr(cls,'_inst'):
print(cls)
cls._inst = super(Singleton, cls).__new__(cls)
return cls._inst
如果Python3的写法跟Python2写法一样,那么倒数第二行会报错
"TypeError: object() takes no parameters"
根据上面的运行结果我们可以发现,在python3中强行使用python2的写法是不可行的。
Python __new__()知识点扩充
__new__() 是一种负责创建类实例的静态方法,它无需使用 staticmethod 装饰器修饰,且该方法会优先 __init__() 初始化方法被调用。
一般情况下,覆写 __new__() 的实现将会使用合适的参数调用其超类的 super().__new__(),并在返回之前修改实例。例如:
class demoClass:
instances_created = 0
def __new__(cls,*args,**kwargs):
print("__new__():",cls,args,kwargs)
instance = super().__new__(cls)
instance.number = cls.instances_created
cls.instances_created += 1
return instance
def __init__(self,attribute):
print("__init__():",self,attribute)
self.attribute = attribute
test1 = demoClass("abc")
test2 = demoClass("xyz")
print(test1.number,test1.instances_created)
print(test2.number,test2.instances_created)
输出结果为
__new__(): <class '__main__.demoClass'> ('abc',) {}
__init__(): <__main__.demoClass object at 0x0000026FC0DF8080> abc
__new__(): <class '__main__.demoClass'> ('xyz',) {}
__init__(): <__main__.demoClass object at 0x0000026FC0DED358> xyz
0 2
1 2
来源:https://www.py.cn/toutiao/21774.html


猜你喜欢
Python字符串格式化
mysql分页原理和高效率的mysql分页查询语句
php将文件夹打包成zip文件的简单实现方法
基于python3实现倒叙字符串

如何配置关联Python 解释器 Anaconda的教程(图解)

python数据可视化Pyecharts库sankey修改桑葚图颜色

python 列表,集合和字典的增删改查
Python中的 enumerate和zip详情

python 通过 pybind11 使用Eigen加速代码的步骤

pip更新问题的解决:'python -m pip install --upgrade pip' 报错问题(最新推荐)

js中的replace方法使用介绍
vue3+vite使用环境变量.env的一些配置情况详细说明

python PaddleOCR库用法及知识点详解
PHP如何从txt文件中读取数据详解

Python统计分析模块statistics用法示例
python包pdfkit(wkhtmltopdf) 将HTML转换为PDF的操作方法
Python全栈之学习HTML

python静态web服务器实现方法及代码详解
MySQL无法输入中文字符问题的解决办法

MySQL 四种连接和多表查询详解
