2016-06-21 56 views
1

我已经阅读说明如何实现单在蟒蛇,就像 Creating a singleton in Python不是类方法和属性的类是python中的单例吗?

我想知道很多文章,是不是类方法的类和属性是一个单例类。

例如

class my_singleton_class(object): 

    _logger = Logger() 
    _printer = Printer() 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

它不是pythonic?这个单例实现有什么问题?

+0

你应该看看这个:http://stackoverflow.com/questions/1318406/why-is-the-borg-pattern-better-than-the-singleton-pattern-in-python – phogl

回答

6

我想知道,是不是类方法和属性是一个单例类。

通过定义一个单独的类是你不能创建超过1个实例类。

让我们把它放到测试:

class my_singleton_class(object): 
    _logger = 1 
    _printer = 2 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

print(id(my_singleton_class())) 
print(id(my_singleton_class())) 
>> 8322128 
>> 8322192 

很明显,我们成功地创建该类的2个不同的实例。

这些实例具有共享属性的事实并不会使此类成为单例。

+0

单身意味着资源应该共享,不应该有像记录器或打印机那样的多个资源实例? – deepak

+0

尽管如此,两个实例并不会被迫共享资源。创建后,您可以独立创建并分配给每个实例的任意属性。 'a = my_singleton_class(); b = my_singleton_class(); a.foo =“bar”; b.x = 3'。 – chepner

+0

@DeepSpace根据您的实现,您创建的两个匿名实例*可能*具有相同的ID,因为第二个可以重用之前由第一个占用的内存。 – chepner

1

从技术上讲,你的例子不是单例。单例是一个将在整个应用程序中访问的类的唯一实例。在Python中,单例类是只能构建一个单一实例的类。

但是,您的类可以用作单例,因为您将直接使用类本身而不是使用单例对象。

logger = my_singleton_class.logger() 

这是每种语言允许的,我可以看到没有立即或严重的警告。所以恕我直言,无论是pythonic还是nor都不是口感问题。

相关问题