Python3__init__方法只初始化一次对象

混江龙づ霸主 提交于 2019-11-27 12:08:31

Python3__init__方法只初始化一次对象-------继上篇创建单例对象博文
代码示例:
1)修改前的代码:(先使用__new__方法创建单例对象-------继上篇博文)

class Dog(object):
    __instance = None

    def __new__(cls, name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #return 上一次创建的对象的引用
            return cls.__instance

    def __init__(self, name):
            self.name = name
            
a = Dog("史努比")
print(id(a))
print(a.name)

b = Dog("巴扎嘿")
print(id(b))
print(b.name)

运行结果:

140460458921936
史努比
140460458921936
巴扎嘿

结果分析:两个id相同说明只创建了一个对象,单例对象,但是两次姓名不同。

目的: 创建多次单例对象时,使其实例属性也相同,即仅仅初始化一次对象,则需要通过修改__init__方法实现。
思路:
在上一篇博文中(Python3__new__方法用法之创建单例对象 ),通过添加一个类属性作为参数,用于在__new__方法中判断是否为第一次创建对象从而达到创建单例对象的目的,同理,我们也可以创建一个类属性,用于在__init__方法中判断是否需要进行初始化,从而达到之初始化一次对象的目的。
2)修改后的方法:

class Dog(object):
    __instance = None
    __init_flag = False      #创建类属性用于__init__方法中的判断

    def __new__(cls, name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #return 上一次创建的对象的引用
            return cls.__instance

    def __init__(self, name):
        if Dog.__init_flag == False:   #如果是第一次则执行下面代码
            self.name = name             #将第一次传入的参数保存到所创建单例对象的实例属性中
            Dog.__init_flag = True      #修改参数的值,以后传入参数不再进行初始化


a = Dog("史努比")
print(id(a))
print(a.name)

b = Dog("巴扎嘿")
print(id(b))
print(b.name)

运行结果:

140036033408976
史努比
140036033408976
史努比

结果分析:两次id和实例属性姓名相同,说明创建的是单例对象并且只初始化了一次。利用if判断,仅仅执行一次初始化,从而达到所要求的目的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!