码迷,mamicode.com
首页 > 编程语言 > 详细

Python单例的一种简单写法

时间:2018-11-01 21:07:44      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:最简   python   自己   直接   att   ext   想法   存在   setattr   

最原始的想法就是每个类都重写new方法。

class Dog:
    dog = None

    def __new__(cls, *args, **kwargs):
        if cls.dog is None:
            cls.dog = object.__new__(cls)
            print('create singleton over')
        return cls.dog

    def __init__(self, name):
        print('init is called')
        self.name = name


# 下面这句话会报错,因为Dog.dog目前为None
# print(Dog.dog.name)
x = Dog('x')
y = Dog('y')
print(x.name)  # y
print(y.name)  # y

最简单的方法是把重写new函数的工作放到一个父类里面,这样就能够实现:只需要继承父类就能够让自己变成单例。

"""
extend this class can make singleton class easily
"""


class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls)
        return cls._instance


class Dog(Singleton):
    def __init__(self, name):
        self.name = name


x = Dog('x')
y = Dog('y')
print(x.name, y.name)

Python的单例相对于Java的单例来说,简明直接得多。我们依旧可以像创建对象一样获取单例的引用,而不必像Java那样只能通过一个函数来获取已经存在的对象。但是,Java单例的实现在语言层面上不做任何修改,Python的单例拦截了对象的创建(new)过程。因为Java的单例没有对语言层面做修改,而Python的灵活性使得Java只是Python的一个子集,所以Java单例的那套创建方式在Python这里同样适用。

需要知道的一点是:Python的new函数才是真正的开辟空间的过程,init函数只是赋值、初始化的过程。

在Python中,我们创建的任何一个对象,无需重写setattr方法即可随便往对象上“悬挂”成员变量。

class Ha:
    pass


x = Ha()
x.dog = 3
print(x.dog)

Python单例的一种简单写法

标签:最简   python   自己   直接   att   ext   想法   存在   setattr   

原文地址:https://www.cnblogs.com/weiyinfu/p/9892304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!