singletons tanımlamak için basit ve zarif bir yolu var mı?

oy
363

Tanımlamak için birçok yol var gibi singletons Python. Yığın taşması bir ortak görüşe var mı?

Oluştur 28/08/2008 saat 10:03
kaynak kullanıcı
Diğer dillerde...                            


22 cevaplar

oy
2

Python için nispeten yeni olan ben en yaygın deyim ne olduğundan emin değilim, ama aklıma gelen basit şey sadece bir modül yerine bir sınıf kullanıyor. Az önce ne modülünde fonksiyonları ve herhangi bir veri haline classınıza olmuştur örnek yöntemleri olurdu sadece yerine sınıfın üyelerinin modülünde değişkenleri haline gelir. Ben bu insanlar için singletons kullanmak sorunun türünü çözmeye pythonic yaklaşımdır şüpheli.

Eğer gerçekten bir tekil sınıf istiyorsanız, açıklanan makul bir uygulama var Google'da ilk hit özellikle "Python tekiz" için,:

class Singleton:
    __single = None
    def __init__( self ):
        if Singleton.__single:
            raise Singleton.__single
        Singleton.__single = self

Bu hileye neden olabilir.

Cevap 28/08/2008 saat 10:09
kaynak kullanıcı

oy
301

Gerçekten fonksiyonları (ve bir sınıf) ile bir modül olarak, gerek görmüyorum bir singleton de hizmet verecek. Tüm onun değişkenleri zaten defalarca örneği edilemedi modülüne bağlı olacaktır.

Bir sınıf kullanmak isteyen yoksa, Python özel sınıflar veya özel kurucular yaratmanın bir yolu yoktur, bu nedenle sadece API kullanımında kongre aracılığıyla başka, birden örneklemesi karşı koruyamaz. Ben hala bir modülde yöntemleri koymak ve tekil olarak modülünü ele alacak.

Cevap 28/08/2008 saat 10:10
kaynak kullanıcı

oy
7

İşte Peter Norvig Python iç hava kalitesi dan bir örnek Python içinde Singleton Desen Nasılsınız? (Sen, doğrudan bir bağlantı yoktur, bu soruyu bulmak için tarayıcınızın üzgün aramayı kullanmalısınız)

Ayrıca Bruce Eckel adlı kitabında, bir örneğini vardır Python Düşünce (yine koduna doğrudan bir bağlantı yoktur)

Cevap 28/08/2008 saat 10:13
kaynak kullanıcı

oy
101

Biraz farklı bir yaklaşım Python tekil olduğunu uygulamak için borg desen Alex Martelli (Google çalışanı ve Python dahi) tarafından.

class Borg:
    __shared_state = {}
    def __init__(self):
        self.__dict__ = self.__shared_state

Bunun yerine aynı kimliğe sahip tüm örneklerini zorlayarak, onlar durumu paylaşmak.

Cevap 28/08/2008 saat 15:53
kaynak kullanıcı

oy
73

Modül yaklaşım iyi çalışıyor. Kesinlikle a tek gerekiyorsa ben metaclass yaklaşımı tercih.

class Singleton(type):
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)
        cls.instance = None 

    def __call__(cls,*args,**kw):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kw)
        return cls.instance

class MyClass(object):
    __metaclass__ = Singleton
Cevap 28/08/2008 saat 20:39
kaynak kullanıcı

oy
14

Bir keresinde ben tüm üye fonksiyonları classmethod dekoratör vardı bir sınıf kullanılan Python a tek yazdım.

class foo:
  x = 1

  @classmethod
  def increment(cls, y = 1):
    cls.x += y
Cevap 29/08/2008 saat 20:15
kaynak kullanıcı

oy
3

Singleton Pattern Python ile uygulanan ActiveState izniyle.

hüner sadece başka bir sınıfın içine tek bir örneği olması gerekiyordu sınıf koymaktır gibi görünüyor.

Cevap 03/09/2008 saat 21:54
kaynak kullanıcı

oy
8

Singleton / şunlardır hatalı olabilir ve bir anti-desen neden tartışan Googl