new⼀个xssfworkbook时出错_⼩猿圈Python知识点之使⽤
__new__实现。。。
最近部分学员在学习python,对于python⾥⾯的有些内容不是很了解,下⾯每天⼩猿圈python讲师就会为⼤家准备⼀个⼩的知识点,希望对你学习python有⼀定的帮助,今天为你分享的是使⽤__new__实现单例模式并解析
单例模式是⼀个经典设计模式,简要的说,⼀个类的单例模式就是它只能被实例化⼀次,实例变量在第⼀次实例化时就已经固定。
在Python中常见的单例模式有None,这就是⼀个很典型的设计,通常使⽤ifxxxisNone或者ifxxxisnotNone来⽐较运算。
Python实现单例模式
代码如下:
class MyClass:
_instance = None
_first_init = False
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, var1, var2):
cls = type(self)
if not cls._first_init:
self.var1 = var1
self.var2 = var2
cls._first_init = True
如上所⽰,我创建了⼀个MyClass的类,定义了两个类变量,第⼀个是_instance,它负责保存该类创建的实例。第⼆个是_first_init,它是⼀个布尔值,保存是否为第⼀次实例化该类。
在__new__⽅法中(构造函数),判断是否存在_instance这个类变量,如果之前已经实例化了,直接返回。如果是第⼀次实例化,就会为_instance类变量绑定实例,使⽤super().__new__(cls)创建实例,即调⽤⽗类object.__new__(MyClass)创建实例。
在__init__⽅法中(初始化函数),我们通过cls=type(self)获取MyClass类,判断是否第⼀次实例化。如果是第⼀次实例化,就绑定实例变量。否则什么都不做.
运⾏效果
我们创建两个实例,来对⽐
>>> instance1 = MyClass(1, 2)
>>> instance2 = MyClass(7, 5)
>>> id(instance1) == id(instance2)
True
>>> instance2.var1
1
可以看到,这两个实例的内存地址都相同,⽽且第⼀次实例化后变量已经固定了,全局不会再改变。
这就是单例模式的实现。
ps:下⾯看下Python中类⽅法、__new__⽅法和__init__⽅法解析
在编程语⾔中创建⼀个类,有构造⽅法这样的⼀个术语。⽽在Python中,通常⼤家都认为__init__是构造⽅法,其实并不完全等同。在构建类中,有⼀个特殊的⽅法__new__,这个才能等同为构造⽅法。
__new__是⼀个类⽅法,我们在定义⼀个类⽅法时需要在函数前打上@classmethod装饰器,⽽__new__不需要,因为它经过特殊处理。为了理解__new__⽅法,我们先来看看类⽅法是什么。
类⽅法
class MyClass:
@classmethod
def test(cls):
print(cls.__name__)
#输出 MyClasspython单例模式
在MyClass类中,test⽅法就是类⽅法,它传⼊第⼀个参数为cls,其实就是MyClass类,打印cls.__name__可以看到结果。类⽅法可以直接类名.⽅法名()调⽤。通常类⽅法是备选构造⽅法。
类⽅法的应⽤
>>> from datetime import datetime
>>> datetime.fromtimestamp(324234)
datetime.datetime(1970, 1, 5, 2, 3, 54)
如上所⽰,内置的datetime包中的fromtimestamp就是类⽅法,可以从多种⽅式构造出datetime对象。
__new__⽅法
def __new__(cls, a):
return super().__new__(cls)
__new__是类⽅法,所以第⼀个参数也是cls,剩下的参数就是构造⽅法⾥需要的参数了。通常__new__都不需要定义,在元类编程中才需要,它可以控制类的⽣成过程。
__new__必须返回⼀个实例(instance),传⼊到__init__⽅法中的self参数,也就是实例变量。这⾥返回⽗类(object)的__new__⽅法⽤来创建⼀个新的实例。相当于
obj = object.__new__(MyClass)
obj = MyClass()
#obj是实例,上⾯两个⽅式等同
其中,MyClass是类,obj是实例(instance)
__init__⽅法
__new__是构造⽅法,那么__init__就是初始化函数,它负责将变量绑定到实例中,更新实例的__dict__字典。其中第⼀个参数self就是
__new__的返回值,是类的实例。__new__⽅法先于__init__⽅法执⾏
def __init__(self, a):
self.a = a
结合使⽤
class MyClass:
def __new__(cls, a):
return super().__new__(cls)
def __init__(self, a):
self.a = a
obj = MyClass(3)
print(obj.a)
要点
1.__new__是构造⽅法,__init__是初始化函数。
2.__new__通常不需要⼿动定义,⼀般在元类编程中使⽤,控制类的⽣成过程。
3.__new__第⼀个被执⾏,然后执⾏__init__绑定实例变量。
4.__new__必须有返回值,返回值是该类的实例,它会被__init__函数接收,通常叫做self变量
以上就是关于⼩猿圈python讲师对使⽤__new__实现单例模式并解析的全部内容,希望本⽂对⼤家的
Python开发有所帮助,最后想要了解更多关于Python和⼈⼯智能⽅⾯内容的⼩伙伴,请关注⼩猿圈在线学习教育平台为您提供权威的Python开发环境搭建视频,学习Python 后的前景⽆限,⾏业薪资和未来的发展会越来越好的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论